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 
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.
Pontos importantes:Usuarios /usuario/* ROLE_USUARIO FORM /login.jsf /error/acessonegado.jsf ROLE_USUARIO 
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:
Pontos importantes:PrimeFaces FileUpload Filter Faces Servlet LoginFilter br.com.lugarcerto.filter.LoginFilter LoginFilter /usuario/* 
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