JSF - Controle de Acesso FERNANDO FREITAS COSTA ESPECIALISTA EM GESTÃO E DOCÊNCIA UNIVERSITÁRIA JSF – Controle de Acesso Antes de iniciarmos este assunto, é importante conhecermos a definição de autenticação e autorização. - Autenticação: deve verificar se um usuário é ele mesmo através de validação de senhas e/ou certificados. - Autorização: com base em um usuário identificado, as regras e controles de permissão e acesso serão aplicadas na aplicação/produto e seus recursos. JSF – Controle de Acesso Ao desenvolvermos uma apliação em java para web, existem várias maneiras de fazer com que o acesso a determinadas páginas só possa ser autorizado mediante um processo de login com sucesso. Entre elas estão: - Servlet Filter - Phase Listener - Java Authentication and Authorization Service (JAAS) - jGuard - Spring Security - Apache Shiro Filters Esta é a forma mais básica e rápida de implementar uma solução deste tipo. O Filter permite a interceptação, manipulação e redirecionamento de todas as requisições HTTP do seu servidor, filtrando o endereço que está sendo acessado. Sendo assim, quando o usuário João acessar aquela URL que é proibida, você pode imediatamente redirecioná-lo para outro endereço, antes que a resposta seja dada ao cliente. Phase Listener “Para as aplicações escritas em JavaServer Faces, além da opção de usar servlets filters, estas podem se utilizar de um recurso especifico do JSF chamado da phase listener que é responsável por interceptar e oferecer mecanismos de manipulações referentes as mudanças de eventos ocorridas no ciclo de vida da especificação. Relacionado ao contexto de autenticação e autorização, ela se encaixa perfeitamente para a implementações de controle de usuários, oferendo ao projetista da aplicação mais uma opção arquitetural.” (Fernando Franzini) Java Authentication and Authorization Service “O JAAS (Java Authentication and Authorization Service) é a API padrão do Java para controle de acesso e autorização em aplicações JavaEE. Com JAAS é possível autenticar e validar usuários e certificados, bem como controlar a possibilidade de acesso e/ou utilização de recursos na aplicação (arquivos, diretórios, URLs, conteúdo, etc).” jGuard jGuard é uma biblioteca que fornece segurança EASY (autenticação e autorização) para aplicações web em Java. Ele é construído sobre a estrutura estável e madura JAAS, que faz parte da API Java J2SE. jGuard é muito flexível e permite várias maneiras diferentes para configurar esses mecanismos de autenticação e autorização, ou seja, em um banco de dados relacional, arquivos XML ou serviço LDAP. jGuard está sob a licença LGPL open source. Spring Security Spring Security é uma estrutura que se concentra em fornecer autenticação e autorização para aplicações Java. Como todos os projetos Spring, o poder real do Spring Security é encontrado em quão facilmente ele pode ser estendido para atender aos requisitos personalizados. Características: - Suporte abrangente e extensível para autenticação e autorização - Proteção contra ataques, como fixação de sessão, clickjacking, cross site request forgery, etc - Integração API Servlet - Integração opcional com Spring Web MVC - Muito mais ... Apache Shiro Apache Shiro é um framework poderoso e fácil de usar que executa autenticação, autorização, criptografia e gerenciamento de sessão. Com a API fácil de entender do Shiro, você pode rapidamente e facilmente proteger qualquer aplicação - desde as menores aplicações móveis até as maiores aplicações web e corporativas. Utilizando o Phase Listener Crie uma nova classe dentro do pacote util chamada Autorizador e faça as importações necessárias. import bean.LoginBean; public class Autorizador implements PhaseListener { @Override public void afterPhase(PhaseEvent event) { FacesContext facesContext = event.getFacesContext(); String currentPage = facesContext.getViewRoot().getViewId(); boolean isLoginPage = (currentPage.lastIndexOf("index.xhtml") > -1); HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); LoginBean loginBean = (LoginBean) session.getAttribute("loginBean"); if (!isLoginPage && loginBean != null && !loginBean.isAutenticado()){ FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Acesso negado", nu facesContext.addMessage("", message); NavigationHandler nh = facesContext.getApplication().getNavigationHandler(); nh.handleNavigation(facesContext, null, "/index.xhtml"); } } @Override public void beforePhase(PhaseEvent arg0) { } @Override public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW;} } Utilizando o Phase Listener Altere seu arquivo faces-config.xml e adicione as linhas a seguir antes da tag </faces-config>. <lifecycle> <phase-listener>util.Autorizador</phase-listener> </lifecycle> Referências FRANZINI, Fernando. Autenticação e Autorização. Disponível em: http://fernandofranzini.wordpress.com/2009/09/09/autenticacao-e-autorizacao/ JEVEAUX, Paulo César M. Autenticação e Autorização: JAAS com JDBC Realm. Disponível em: http://jeveaux.com/2009/autenticacao-e-autorizacao-jaas-com-jdbc-realm/ jGuard. Disponível em: http://jguard.xwiki.com/xwiki/bin/view/Main/WebHome LANHELLAS, Ronaldo. JSF Filter: Criando um sistema de login com criptografia MD5. Disponível em: http://www.devmedia.com.br/jsf-filter-criando-um-sistema-de-login-com-criptografiamd5/29975#ixzz314wGJJn4 Spring Security. Disponível em: http://projects.spring.io/spring-security/