Tutorial de JAAS

Viva,

consigo fazer o login com o JAASRealm. Mas estou não estou a usar o login com FORM mas sim com BASIC. Estou a usar uma servlet com session.invalidate(). Não me aparece a janela realm de autenticação depois de fazer o logout…alguém me pode dizer qual é o meu erro?

Cumprimentos,

Mazarama

Onde eu adiciono o arquivo de configuração b[/b].
Na minha aplicação, implementei a classe de LoginModule, web.xml, JSPs, adicionei o Realm no server.xml(com as devidas configurações do BD), etc… mas esse arquivo nãio sei onde colocar…
Alguém poderia me ajudar ???

Olá a todos,

Só estou postando para agradecer a boa vontade do fviana em criar esse tutorial.
Meus parabéns. Espero poder ajudar desta forma ou de outra assim que possível.

Ola pessoal!
Sabem dizer-me como posso aplicar o logout(), isto é, como posso chamar essa função em html ou numa servlet?
Obrigado

Como pego o tipo de Erro/Exception da autenticação no meu jsp de resultado??

Por exemplo:

1 - Senha errada!
2 - Senha vencida!
3 - Primeira vez que acessa -> troque a senha!
4 …

[quote=luisilvaJAVA]Ola pessoal!
Sabem dizer-me como posso aplicar o logout(), isto é, como posso chamar essa função em html ou numa servlet?
Obrigado[/quote]

session.invalidate()

Pessoal dúvida simples, de onde vem os outros paramentros para a conexão com o banco tipo usuario, senha, …? Antes que me esqueça um otimo tutorial, valeu.

     dataSourceName="jdbc/GUJ"

Esqueleto

public void doLogout(ActionEvent event) throws IOException{
	     final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
	     request.getSession( false ).invalidate();	
             FacesContext.getCurrentInstance().getExternalContext().redirect("/aplicacao");
	}

Cara, alguém conseguiu fazer isso funcionar assim como está descrito? Tive que fazer um grupo de Roles implementando Group e adicionando Role ao grupo.
tipo:

 grupoRole.addMember(new Role("admin'));
 grupoRole.addMember(new Role("logado));
 subject.getPrincipals().add(UsuarioPrincipal("teste"));
 subject.getPrincipals().add(grupoRole);

Queria saber como auntenticar em um WebService via swing. Alguém ai sabe?

Pessoal,

implementei seguindo este tutorial com a classe GujLoginModule tudo direitinho.

Coloquei logs e ele esta chamando o método login, validando o usuário e no final chamando o método commit() certinho.

Quando ele terminar o método commit retorna para tela a seguinte mensagem :

HTTP Status 403 - Access to the requested resource has been denied

Alguém sabe me dizer por que?

Obrigado

Cgneo, ninguém respondeu a minha duvida, mas acredito que seja pelo mesmo motivo que tive que criar um grupo de roles chamado Roles conforme descrito

Amigo,

fiz o que você falou mas mesmo assim deu erro 403.

Estou a seguir colocando a classe que implementei, esta cheio de log, pois estava analisando por onde passou. O engraçado que ele vai até o commit certinho.

Tem como você me enviar o seu código desta classe para comparar.

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
import javax.sql.DataSource;

public class GujLoginModule implements LoginModule {
private boolean commitSucceeded = false;
private boolean succeeded = false;

private User user;
private Set roles = new HashSet();

private GroupRole grupoRole = new GroupRole("abc");

protected Subject subject;
protected CallbackHandler callbackHandler;
protected Map sharedState;
private String dataSourceName;
private String sqlUser;
private String sqlRoles;

public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) {
	System.err.println("1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + callbackHandler);
	this.subject = subject;
    this.callbackHandler = callbackHandler;
    this.sharedState = sharedState;
    dataSourceName = (String) options.get("dataSourceName");
    sqlUser = (String) options.get("sqlUser");
    sqlRoles = (String) options.get("sqlRoles");
}

public boolean login() throws LoginException {
	System.err.println("2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    // recupera o login e senha informados no form
    getUsernamePassword();

    Connection conn = null;
    try {
        // obtem a conexão
        try {
            Context initContext = new InitialContext();

// Context envContext = (Context) initContext.lookup(“java:/comp/env”);
// DataSource ds = (DataSource) envContext.lookup(dataSourceName);

            DataSource ds = (DataSource) initContext.lookup(dataSourceName);
            conn = ds.getConnection();
        } catch (NamingException e) {
        	System.err.println("2 NamingException");
            succeeded = false;
            throw new LoginException("Erro ao recuperar DataSource: " + e.getClass().getName() + ": " + e.getMessage());
        } catch (SQLException e) {
        	System.err.println("2 SQLException");
            succeeded = false;
            throw new LoginException("Erro ao obter conexão: " + e.getClass().getName() + ": " + e.getMessage());
        }
        // valida o usuario
        validaUsuario(conn);
    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
            }
        }
    }
    // acidiona o usuario e roles no mapa de compartilhamento
    sharedState.put("javax.security.auth.principal", user);
    sharedState.put("javax.security.auth.roles", roles);

    return true;
}

public boolean commit() throws LoginException {
	System.err.println("3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    // adiciona o usuario no principals
    if (user != null && !subject.getPrincipals().contains(user)) {
    	
    	System.err.println("3 user = " + user );
        subject.getPrincipals().add(user);
    }
    // adiciona as roles no principals
    if (roles != null) {
        Iterator it = roles.iterator();
        while (it.hasNext()) {
            Role role = (Role) it.next();
            if (!subject.getPrincipals().contains(role)) {
            	System.err.println("Aqui 3 role = [" + role.getName()+"]" );
            	grupoRole.addMember(role);
            }
        }
        System.err.println("3 adicionando grupoRole" + grupoRole);
        subject.getPrincipals().add(grupoRole);
    }
    
    commitSucceeded = true;
    
    System.err.println("3 commitSucceeded xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    return true;
}

public boolean abort() throws LoginException {
	System.err.println("4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    if (!succeeded) {
        return false;
    } else if (succeeded && !commitSucceeded) {
        succeeded = false;
    } else {
        succeeded = false;
        logout();
    }

    this.subject = null;
    this.callbackHandler = null;
    this.sharedState = null;
    this.roles = new HashSet();

    return succeeded;
}

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

/**
 * Valida login e senha no banco
 */
private void validaUsuario(Connection conn) throws LoginException {
	System.err.println("6xxxxxxxxxxxxxxx loginInformado = "+ loginInformado);
    String senhaBanco = null;
    PreparedStatement statement = null;
    ResultSet rs = null;
    try {
        statement = conn.prepareStatement(sqlUser);
        statement.setString(1, loginInformado);
        rs = statement.executeQuery();
        if (rs.next()) {
            senhaBanco = rs.getString(1);
        } else {
            succeeded = false;
            System.err.println("Usuário não localizado.");
            throw new LoginException("Usuário não localizado.");
        }
    } catch (SQLException e) {
        succeeded = false;
        
        System.err.println("Erro ao abrir sessão: "
                + e.getClass().getName() + ": " + e.getMessage());
        throw new LoginException("Erro ao abrir sessão: "
                + e.getClass().getName() + ": " + e.getMessage());
    } finally {
        try {
            if (rs != null)
                rs.close();
            if (statement != null)
                statement.close();
        } catch (Exception e) {

        }
    }

    if (senhaInformado.equals(senhaBanco)) {
        user = new User(loginInformado);
        recuperaRoles(conn);
        user.setRoles(roles);
        return;
    } else {
        throw new LoginException("Senha Inválida.");
    }
}

/**
 * Recupera as roles no banco
 */
public void recuperaRoles(Connection conn) throws LoginException {
	System.err.println("7xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    PreparedStatement statement = null;
    ResultSet rs = null;
    try {
        statement = conn.prepareStatement(sqlRoles);
        statement.setString(1, loginInformado);
        rs = statement.executeQuery();
        while (rs.next()) {
            roles.add(new Role(rs.getString(1)));
            
            System.err.println("7 rs.getString(1) = ["+rs.getString(1)+"]");
        }
        
        //roles.add(new Role("LOGADO"));
    } catch (SQLException e) {
    	System.err.println("7 SQLException" + "Erro ao recuperar roles: " + e.getClass().getName() + ": " + e.getMessage());
        succeeded = false;
        throw new LoginException("Erro ao recuperar roles: " + e.getClass().getName() + ": " + e.getMessage());
    } finally {
        try {
            if (rs != null)
                rs.close();
            if (statement != null)
                statement.close();
        } catch (Exception e) {

        }
    }
}

/**
 * Login do usuário.
 */
protected String loginInformado;

/**
 * Senha do usuário.
 */
protected String senhaInformado;

/**
 * Obtem o login e senha digitados
 */
protected void getUsernamePassword() throws LoginException {
	System.err.println("8xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
	if (callbackHandler == null) {
		System.err.println("8 callbackHandler == null");
        throw new LoginException("Error: no CallbackHandler available to garner authentication information from the user");
	}
    Callback[] callbacks = new Callback[2];
    callbacks[0] = new NameCallback("Login");
    callbacks[1] = new PasswordCallback("Senha", false);
    try {
        callbackHandler.handle(callbacks);
        loginInformado = ((NameCallback) callbacks[0]).getName();
        char[] tmpPassword = ((PasswordCallback) callbacks[1]).getPassword();
        senhaInformado = new String(tmpPassword);
        ((PasswordCallback) callbacks[1]).clearPassword();
    } catch (java.io.IOException ioe) {
    	System.err.println("8 ioe");
        throw new LoginException(ioe.toString());
    } catch (UnsupportedCallbackException uce) {
    	System.err.println("8 uce");
        throw new LoginException("Error: " + uce.getCallback().toString() + " not available to garner authentication information from the user");
    }
}

}

Cara formata a parada assim…

      private GroupRole grupoRole = new GroupRole("abc");

A minha duvida era essa… não sei explicar mas só funciona se colocar

      private GroupRole grupoRole = new GroupRole("Roles");

Camarada funcionou com o Roles.

Muito obrigado, vou tentar descobrir porque depois coloco no fórum.

Só mais uma dúvida/problema que provavelmente você já deve ter enfrentado.

Agora consegui realizar autenticação e autorização (com a sua ajuda), mas vamos dizer que estou logado com um usuário e quero logar com outro na mesma sessão, ou seja, clico no link da página de login.jsp e entro com outro usuário aparece a seguinte mensagem.

HTTP Status 404 - /teste/j_security_check

Sabe porque? Como contorno isto?

Bom … isso eu não sei … e também não sei porque fazer isso… logar 2 usuarios na mesma sessão?

Vou tentar melhorar minha pergunta.

Como faço para o container acionar o método logout?

Att,

Anderson de Lima.

Bom … eu estrou usando

   session.invalidate(); 

Não fiz os testes ainda com o modulo web, mas está funcionando… o problema é que eu acho que ele está guardando na memória o registro do usuario e da segunda vez eu eu logo ele não busca novamente do banco.

Estou usando a validação em um webservice então como ele é stateless não preciso preocupar com o logout, eu acho.

Então amigo,

estou fazendo da mesma forma com session invalidate e ele está também cacheando em algum lugar, porque quando logo a segunda vez ele não consulta de novo no banco.

Além disso, quando executo o invalidate ele não esta chamando o método logout da classe LoginModule.

Queria saber qual evento tenho que gerar para chamar o método logout implementado, pois dai acredito que vai funcionar.

Será que ninguém aqui enfrentou este problema que estamos conversando.

Abraço,

É eu reparei nisso. Com webservice ele verifica todas as vezes em que chamo um método, no meu caso, era exatamente o que queria, então não me preocupei com o logout. Pelo que li em um livro PDF - Jaas in Action http://www.jaasbook.com/ ele usa o session invalidate quando utilizado em aplicações web. Só consegui usar o logout quando faço login através do LoginContext, em vez de usar o form.

Alguém ai ja usou o LoginContext? Como eu aponto ele para o jboss? Preciso logar uma aplicação swing.