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:
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
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