Tutorial de JAAS

em 22/09/2006 , por Fábio Viana
Tutorial de JAAS
1 - Introdução O JAAS (Java Authentication and Authorization Service) é um conjunto que APIs que permite que as aplicações Java tenham um controle autenticação e de acesso. O JAAS implementa uma versão Java do framework padrão Pluggable Authentication Module (PAM), e suporta autorização baseada em usuário. Isso permite que aplicações fiquem independentes desse controle de segurança. Serve para controlar permissões de vários tipos de recursos: arquivos, diretórios, conteúdos, URLs. Para aplicações web, basta seguir os passos abaixo. Quando usamos este padrão de segurança, devemos estar cientes que este modulo está a nível de servidor de aplicação e não de aplicação, ou seja, este modulo de autenticação será executado pelo servidor de aplicação, antes mesmo de acessar a aplicação. 2 - Criação do modulo de login Existe uma interface definida no j2ee que é usada para efetuar o login: javax.security.auth.spi.LoginModule. Devemos implementá-la, conforme o exemplo abaixo:





O método initialize() é invocado sempre que uma nova autenticação é solicitada. São passados como parametros o Subject, CallbackHandler, o mapa de objetos compartilhados e o mapa de opções do login.config (sessão 3). O mais importante destes parametros para nós será o options, pois nele receberemos os parametros de sql e datasource. O método login() é invocado quando é enviado os dados (login e senha) de autenticação. O método commit() é invocado quando o login() obtém sucesso. O método abort() é invocado quando o login() não obtém sucesso. O método logout() é invocado quando o usuário desloga da aplicação. Agora, com as classes de login criadas, devemos gerar um jar e adicionar no classpath do servidor de aplicação. No tomcat, basta colocar o jar em $CATALINA_HOME/common/lib. Obs.: Principal é a interface usada para acessar o login (no caso da classe User) e a role (no caso da classe Role)
3- Configurações Devemos agora configurar o nosso login. Para que o servidor de aplicação use nosso modulo de login, devemos criar um arquivo (login.config) contendo as informações necessárias para carregar o modulo. Ele deve ter o seguinte formato:

O flag requerid, indica se a autenticação naquela classe é requerida. Podemos ter vários validadores de login (classe LoginModule) para o mesmo modulo de login. Caso queira-se autenticar no banco e no ldap, basta implementar o LoginModule pra cada um e colocar no login.config. No nosso exemplo ficaria assim:

A partir de agora, toda vez que iniciarmos o servidor de aplicação, será necessário informar o arquivo de configuração, desta forma: -Djava.security.auth.login.config=$CATALINA_HOME/conf/login.config Até aqui, o servidor de aplicação já estará configurado com nosso modulo.
4- Segurança na aplicação Agora temos que adicionar a segurança em nossa aplicação. Para que nossa aplicação faça uso do modulo de segurança, devemos adicionar um realm no contexto.

Repare que a url /cliente.do possue duas roles, será avaliado se o usuario posue alguma delas. Repare tambem que foi criado uma role LOGADO. Ela serve pra validar aquelas url's que basta que o usuario esteje logado. Agora só falta criar o formulário de login. Crie um arquivo para o formulario (login.jsp). Observe abaixo o exemplo:

Sempre coloque os nomes dos campos de login e senha como j_username e j_password. Este j_security_check é apenas para que o servidor de aplicação identifique que se trata de uma tentativa de login. Crie tambem um arquivo de erro (erro.jsp):

Para concluir, adicione mais esta configurão no web.xml. Trata-se do mapeamento dos arquivos login.jsp e erro.jsp.

Pronto! Quando for acessado a url /cliente.do, o servidor de aplicação irá identificar que é necessário autenticação, se não foi feita anteriromente ele irá redirecionar para a pagina de login até que o usuario seja autenticado.
5 - Conclusão O jaas é um pouco limitado e cheio de restrições, mas para controlar segurança e autenticação é o mais recomendado. Caso precise de adicionar regras na autenticação, como por exemplo expiração de senha, use um filter só para ver se o usuario está com a senha expirada. Caso precise do usuario autenticado e/ou a(s) role(s) em um Servlet, Action... basta usar os metodos: