
Aplicações que restringem o acesso de usuários ou processos a apenas alguns de seus recursos são muito comuns; implementar esse tipo de controle de segurança, no entanto, não é nada fácil – e fazê-lo de forma que a aplicação seja independente da tecnologia de segurança utilizada é ainda mais difícil. É exatamente isso que o JAAS (Java Authentication and Authorization Service) se propõe a resolver.
Conceitos
Antes de descrever a API de autenticação e autorização de Java, precisamos apresentar alguns conceitos:
• Autenticação é o processo de identificação de um “usuário” (pessoa, processo etc.) em um sistema. Isto é feito comparando-se as credenciais passadas pelo usuário com as esperadas pelo sistema. O método mais comum de autenticação é o uso de senhas, mas pode-se utilizar várias outras técnicas, como biometria.
• Autorização é o processo de verificação dos direitos que um usuário possui para acessar/manipular um determinado recurso do sistema. Um exemplo seria restringir o acesso de um cliente de um banco a apenas sua própria conta.
Iniciando a autenticação
Ao iniciar o processo de autenticação com JAAS, a aplicação deve criar um objeto do tipo javax.security.auth.login.LoginContext, passando para ele um nome de configuração de módulos de login (que são implementações da interface javax.security.auth.spi.LoginModule). Essa configuração é definida em um arquivo-texto simples, externo à aplicação (veja detalhes adiante).
O LoginContext é responsável por armazenar as informações do usuário; o LoginModule, por obter essas informações.
Veja a Listagem 1. Note que, antes de instanciar o LoginContext, foi criado um javax.security.auth.Subject. Um Subject
armazena as informações relacionadas a uma entidade colhidas no processo de autenticação, por exemplo: o nome, o login e a senha de um usuário. Para isso, o Subject usa um ou mais objetos java.security.Principal, representando
identidades e, opcionalmente, credenciais públicas ou privadas.
Listagem 1. Exemplo de autenticação: JMMain.java package jm.jaas; import java.security.*; import javax.security.auth.*; import javax.security.auth.callback.*; import javax.security.auth.login.*; // Usando o JAAS para fazer o login e o logout de um usuário public class JMMain { public static void main(String[] args) { ?// Informaçoes e objetos necessários para o login String nomeConfiguracao = “JavaMagazine”; Subject subject = new Subject(); CallbackHandler callbackHandler = new JMCallbackHandler(); // Cria LoginContext LoginContext context = null; try { context = new LoginContext( nomeConfiguracao, subject, callbackHandler); } catch (LoginException le) { ?System.out.println(“Erro criando LoginContext. Mensagem:“ + le.getMessage()); System.exit(1); } // Realiza o login do usuário na aplicação try { context.login(); System.out.println(“Login bem sucedido”); ...