quarta-feira, 23 de maio de 2012

Tutorial - Configuração JAAS JBoss 6.1

Fala pessoal,

Vou descrever um pequeno tutorial de como configurar o JAAS no JBoss 6.1 Final e capturar o usuário em sua aplicação após a autenticação. Como é meu primeiro tutorial, dúvidas e sugestões são bem vindas!

1º Passo: Alterar o arquivo "jboss-6.1.0.Final/server/default/conf/login-config.xml" adicionando a política de autenticação utilizada na apliacação

    
        
            java:/lugarcerto
            SELECT U.SENHA FROM USUARIO U WHERE U.EMAIL=?
            SELECT P.DS_PERFIL, 'Roles' FROM USUARIO U
       INNER JOIN PERFIL P ON U.PERFIL_ID_PERFIL = P.ID_PERFIL WHERE U.EMAIL=?
     MD5
     hex
        
    
Pontos importantes:
Linha 1: nome da configuração
Linha 3: Nome da classe que implementará o processo de login, neste caso utilizaremos uma classe do próprio jboss, "DatabaseServerLoginModule". Informarei no final do tutorial um link para outro tutorial, no qual a classe login module é implementada.
Linha 4: Nome do JNDI Name
Linha 5: SQL para buscar a senha forme um identificador, no caso foi utilizado o email como identificador do usuário.
Linha 6: SQL para buscar as roles(papéis) necessários para autenticar no sistema. Caso o usuário no banco não tenha o papel configurado, o acesso não é liberado. Estas roles serão configuradas mais a frente, no arquivo web.xml
Linha 8 e 9: Definição do algoritmo e enoding referente a senha. Isto é muito importante, caso o encoding do Hash utilizado para gerar a senha não seja o mesmo configurado neste arquivo, a autenticação não será liberada!



2º Passo: Configurar o arquivo web.xml para reconhecer as retrições de segurança.

    
      Usuarios
      /usuario/*
    
    
      ROLE_USUARIO
    
  
  
    FORM
    
      /login.jsf
      /error/acessonegado.jsf
    
  
  
    ROLE_USUARIO
  
Pontos importantes:
Linhas 1 a 9: Definição do resource que será protegido e qual role terá acesso. Importante: o nome "ROLE_USUARIO" deve estar igual na tabale de roles.
Linha 13: Página de login.
Linha 14: Página de acesso negado


3º Passo: Filtro de Login para pegar o usuário do JAAS e manupilar na sua aplicação. Neste exemplo, estou buscando o usuário no banco de dados e setando na sessão. Adicionar o seguinte código ao arquivo web.xml



    PrimeFaces FileUpload Filter
    Faces Servlet
  
  
    LoginFilter
    br.com.lugarcerto.filter.LoginFilter
  
  
    LoginFilter
    /usuario/*
  
Pontos importantes:
Linha 11: Definição do resource protegido, definir o mesmo do 2º passo. Senão o filtro irá busca um usuário que ainda não foi autenticado pelo JAAS.

Classe LoginFilter:
package br.com.lugarcerto.filter;
package br.com.lugarcerto.filter;

import java.io.IOException;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import br.com.lugarcerto.LugarCertoConstants;
import br.com.lugarcerto.business.local.UsuarioBBusinessLocal;

public class LoginFilter implements Filter {

 @Resource
 private SessionContext sessionContext;

 @Override
 public void destroy() {
  // TODO Auto-generated method stub

 }

 @Override
 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {
  HttpServletRequest servletRequest = (HttpServletRequest) request;
  HttpSession httpSession = servletRequest.getSession(false);
  if (httpSession.getAttribute(LugarCertoConstants.USUARIO_LOGADO_FB) == null) {
   try {
    final Context ctx = new InitialContext();
    UsuarioBBusinessLocal bean = (UsuarioBBusinessLocal) ctx
      .lookup(UsuarioBBusinessLocal.JNDI_NAME);
    bean.setUsuarioLogadoSessao((HttpServletRequest) request);
   } catch (NamingException e) {
    e.printStackTrace();
   }
  }

  chain.doFilter(request, response);
 }

 @Override
 public void init(FilterConfig arg0) throws ServletException {
  // TODO Auto-generated method stub

 }

}
Pontos Importantes:
Método doFilter: Verifica se o usuário já está na sessão, senão estiver chama o método do EJB para seta-lo na sessão
Observação:  Só irá cair neste filtro após o processo de autenticação com sucesso! Antes disto, o próprio JBoss irá redirecionar o usuário para a tela de login cadastrada no web.xml

Método EJB:
        @Resource
 private SessionContext sessionContext;

        /**
  * @see UsuarioBBusinessLocal#setUsuarioLogadoSessao()
  */
 public void setUsuarioLogadoSessao(HttpServletRequest httpServletRequest) {
  Principal user = sessionContext.getCallerPrincipal();
  Usuario usuario = this.findUsuarioByEmail(user.getName()).get(0);
  HttpSession session = httpServletRequest.getSession(false);
  session.setAttribute(LugarCertoConstants.USUARIO_LOGADO_APP_FB, usuario);

 }
Pontos importantes:
Linha 8: Pega o objeto "Principal", objeto setado pelo JAAS, representa o usuário logado. Como este usuário não contem todos os atributos do usuário da minha aplicação, utilizo o identificador(e-mail) para busca-lo no banco de dados e seta-lo na sessão.

4º Passo: JSF com o form de login


Pontos Importantes:
Utilizar action="j_security_check" no form e os inputs de senha e e-mail com os nomes: j_username e j_password. Basta este form para publicar o usuário.

É isto pessoal, críticas e sugestões são bem vindas!

Nenhum comentário:

Postar um comentário