Problemas ao efetuar Logout usando JAAS

5 respostas
S

Boa Tarde Galera,

Estou com um problemão que não estou conseguindo resolver por nada.

Estou usando autenticação com o JAAS + JBOSS 4.2.3.
O processo autentica tudo certo. O problema esta ao efetuar o logout.

Ao tentar recuperar o Subject que foi setado no metodo commit o mesmo sempre esta retornando nullo ao efetuar o logout.

Metodo Logout

public boolean logout() throws LoginException {  
         // remove o usuario e as roles do principals  
         subject.getPrincipals().removeAll(roles);  
         subject.getPrincipals().remove(user);  
         return true;  
  }

Efetuei o teste de retorno usando request e funciona normalmente.

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        System.out.println("Nome do Usuario Logado Remote User: " + request.getRemoteUser());
        System.out.println("Nome do Usuario Logado                   : " + request.getUserPrincipal());

Metodo Commit

public boolean commit() throws LoginException {
        SimpleGroup userRoles = new SimpleGroup("Roles");
        // adiciona o usuario no principals
        if (getUser() != null && !subject.getPrincipals().contains(user)) {
            subject.getPrincipals().add((Principal) user);
        }
        // adiciona as roles no principals
        if (getRoles() != null) {
            Iterator it = getRoles().iterator();
            while (it.hasNext()) {
                Role role = (Role) it.next();
                if (!subject.getPrincipals().contains(role)) {
                    //subject.getPrincipals().add(role);
                    userRoles.addMember(role);
                }
            }
            subject.getPrincipals().add(userRoles);
        }
        commitSucceeded = true;
        return true;
    }

Alguem ja passou por isto ou sabe como resolver, agradeço.

Abcs

5 Respostas

G

Se você está em uma aplicação web basta você fazer um HttpSession.invalidate que até o JAAS context invalida junto.

S

Invalidar apenas a sessão não esta funcioando. Quando eu faço alguma alteração com o usuario e seu perfil e acesso novamente, os dados de acesso continua com os dados antigos. A sessão só esta sendo morta no servidor ao efetuar o restart do JBOSS, caso contrario não esta funcionando.

Neste caso acredito eu que tem que limpar do server JBOSS o subject.getPrincipal(), mas não estou conseguindo.

Abcss

Se alguem tiver alguma ideia por favor me ajude, :wink:

abcss

G

Você está usando qual método de autenticação? form, base ou digest?

S

Estou utilizando o metodo FORM.

<login-config>
        <auth-method>FORM</auth-method>
        <realm-name>LoginModule</realm-name>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/error.jsp</form-error-page>
        </form-login-config>
    </login-config>
G

Te perguntei isso porque se você usar o BASIC não existe login e logout, pois o seus dados de acesso são reenviados a cada requisição, como se fosse um novo login. No caso do form o session.invalidate deveria funcionar.

Notei uma coisa que vocẽ falou:

Isso significa que você altera os dados do usuário e logo após pensa que tudo será atualizado? O contexto do JAAS é separado da sua aplicação, ela está em um nível mais acima. Por isso você precisa fazer um logout e depois login. Ou seja, chame o session.invalidate que automaticamente a sessão e o jaas-context morrem e um novo login é solicitado.

Nunca usei JBOSS, mas no Glassfish e no OC4J são assim.

Criado 8 de abril de 2010
Ultima resposta 9 de abr. de 2010
Respostas 5
Participantes 2