Bom dia, Tenho em minha aplicação o controle de acesso feito em JAAS, mas surgiu uma solicitação que antes da autenticação do usuário o sistema deve primeiro verificar o acesso do mesmo em um webservice.
O problema é que como a tela de login não há managedbean que a controle pelo fato da mesma ser implementada no padrao JAAS de autenticação, acarretou em uma série de mudanças que tive que fazer quanto a autenticação.
Criei uma managedBean para minha tela de login.
Logo após, implementei a classe SecurityHelper que se comunicará com a classe que extend de LoginModule.
public class SecurityHelper {
private LoginContext loginContext = null;
private String loginModule;
public SecurityHelper(String loginModule) {
this.loginModule = loginModule;
}
public void authenticate(String userId, String password) throws LoginException {
loginContext = new LoginContext(loginModule, new LoginCallback(userId, password));
loginContext.login();
}
public Subject getSubject() {
Subject result = null;
if (loginContext != null) {
result = loginContext.getSubject();
}
return result;
}
public static class LoginCallback implements CallbackHandler {
private String userName = null;
private String password = null;
public LoginCallback(String userName, String password) {
this.userName = userName;
this.password = password;
}
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nc = (NameCallback) callbacks[i];
nc.setName(userName);
} else if (callbacks[i] instanceof PasswordCallback) {
PasswordCallback pc = (PasswordCallback) callbacks[i];
pc.setPassword(password.toCharArray());
}
}
}
}
}
e na minha classe LoginMBeanForm eu faço a chamada ao método authenticate
public String login() {
String retorno = "";
SecurityHelper jaasHelper = new SecurityHelper("gcont");
try {
jaasHelper.authenticate(usuario, senha);
return "home";
} catch (LoginException e) {
FacesUtil.addErrorMessage(e.getMessage());
}
return retorno;
}
Tudo ocorre perfeitamente, mas… quando o método abaixo é invocado,
public void authenticate(String userId, String password) throws LoginException {
loginContext = new LoginContext(loginModule, new LoginCallback(userId, password));
loginContext.login();
}
chama minha classe que implementa LoginModule e ao debugar, constatei que o método login e commit retornam true.
Mas ao voltar a classe SecurityHelper, não renderiza minha página. Fiz um spect no loginContext e o mesmo estava carregada. Notei uma particularidade que acho que pode ser o fator que esta impedindo que o login seja concretizado. Dentro de loginContext tem um atributo “success” e o mesmo vem como false. O problema é que não consigo ter acesso ao mesmo para setar true em caso de sucesso no login.
Achei estranho este atributo vir como false já que o método login e commit retornaram true.
Alguém ja passou por situação parecida? ou tem alguma sujestão?
Grato.