Hi,
Is there any tutorial about How to properly login user with IFS in java?
Because I am facing really stranges problems and I wonder if it because I use IFS connection badly. The doc is really poor and I can’t find any example…
Login function (POST /login) that returns a JWT token
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
		loginVM.getUsername(), loginVM.getPassword());
try {
	Authentication authentication = this.authenticationManager.authenticate(authenticationToken);
	SecurityContextHolder.getContext().setAuthentication(authentication);
	long tokenValidityInMilliseconds = 0;
	tokenValidityInMilliseconds = 1000 * ifsProperties.getSecurity().getJwt().getTokenValidityInSeconds();
	System.out.println("Token validity: " + tokenValidityInMilliseconds);
	// Remove the token from the pool after expiration
	serverPool.removeServerAfter(authentication.getName(), tokenValidityInMilliseconds);
	String jwt = tokenProvider.createToken(authentication, false);
	response.setStatus(200); 
	redirectAttributes.addAttribute("token", jwt);
	try {
		response.getOutputStream().write(jwt.getBytes());
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			response.getOutputStream().close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
} catch (AuthenticationException ae) {
	log.trace("Authentication exception trace: {}", ae);
	// Omitted
}
The autenticate function :
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.AuthenticationServiceException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
	private final UserService userService;
	public CustomAuthenticationProvider(UserService userService) {
		this.userService = userService;
	}
	@Override
	public Authentication authenticate(Authentication authentication) throws AuthenticationException 
    {
		String name = authentication.getName();
		String password = authentication.getCredentials().toString();
		try {
			userService.isValidUser(authentication);
			final List<GrantedAuthority> grantedAuths = new ArrayList<>();
			grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
			return new UsernamePasswordAuthenticationToken(name, password, grantedAuths);
		}
		catch(APException e){
				throw new AuthenticationServiceException(e.getErrorType().toString());
		}	
	}
}
Finally the isValidUser and getUser function :
public boolean isValidUser(Authentication authentication) throws APException
{
	Server server = new Server();
	server.setConnectionString(ifsProperties.getConnectionString());
	String username = (String) authentication.getPrincipal();
	String password = (String) authentication.getCredentials();
	server.setLocale("fr-FR");
	server.setCredentials(username, password);
	User user = getUser(server, (String) authentication.getPrincipal());
	if (user != null) {
		user.setUsername(username);
		users.put(username, user);
		serverPool.addServer(username, server);
		return true;
	}
	return false;
}
private User getUser(Server server, String identity) throws APException {
	PlsqlSelectCommand cmd = new PlsqlSelectCommand(server,"SELECT * FROM &AO.FND_USER WHERE WEB_USER = :WEB_USER");
	Record params = cmd.getBindVariables();
	params.add("WEB_USER").setValue(identity.toUpperCase());
	RecordCollection result = cmd.executeQuery();
	if (result.size() == 0) {
		return null;
	}
	String sessionId = getSessionId(server);
	User user = new User();
	user.setIdentity((String) result.get(0).findValue("IDENTITY"));
	user.setDescription((String) result.get(0).findValue("DESCRIPTION"));
	user.setSessionId(sessionId);
	user.setCompany(getCompany(server));
	user.setSubcontractor(testUserSubctr(server, user));
	return user;
}
So it set a server in a pool. For each next request it checks if a server is available, if it is I continue, if not it throw a 401 error.
Is it the good way of handling IFS Connection?
Thanks A LOT for your help :)
Antoine
