Tenho visto por aí muitos tutoriais de JAAS, porém cada um tem uma abordagem um pouco diferente para configurar tudo.
Estou fazendo uma aplicação de testes, justamente para aplicar o JAAS e ver a viabilidade dele nos projetos futuros aqui na empresa.
Minha aplicação é baseada em EJBs e tem uma interface web.
Bom, explicando passo-a-passo como configurei:
1) Configurei o módulo JAAS no JBoss para pegar as informações de login no banco de dados, no arquivo $JBOSS/server/default/conf/login-config.xml:
<application-policy name="exemplo1">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="dsJndiName">java:jdbc/Infra_Seguranca</module-option>
<module-option name="principalsQuery">SELECT COD_USUARIO AS Password FROM USUARIO WHERE COD_USUARIO=?</module-option>
<module-option name="rolesQuery">SELECT NOME_ROLE AS Roles, 'Roles' AS RoleGroups FROM ROLE_USUARIO WHERE COD_USUARIO=?</module-option>
</login-module>
</authentication>
</application-policy>
2) No web.xml configurei para proteger as URLs "*.do":
<security-constraint>
<web-resource-collection>
<web-resource-name>Restricted</web-resource-name>
<description>Declarative security tests</description>
<url-pattern>*.do</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>xxx</role-name>
</auth-constraint>
<user-data-constraint>
<description>no description</description>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>exemplo1</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginErro.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description>Role xxx</description>
<role-name>xxx</role-name>
</security-role>
3) Configurei o jboss-web.xml:
<?xml version="1.0"?>
<jboss-web>
<security-domain>java:/jaas/exemplo1</security-domain>
</jboss-web>
Bom, isso funciona perfeitamente. Ele remete para a página de login quando uma URL é protegida. Depois do login ele autoriza os acesso conforme as roles do usuário autenticado.
Porém eu queria também configurar os meus EJBs para estarem protegidos com JAAS. Mas não estou tendo muito sucesso.
Meu EJB Stateless Session Bean está assim:
@RolesAllowed("yyy")
@Stateless(name="CadastroUsuario")
public class CadastroUsuarioBean implements CadastroUsuario {
public void cadastrar(Usuario usuario) {
//...
}
}
Porém o container ignora a marcação @RolesAllowed e dá direito para o usuário chamar a página web que faz chamada a este método do EJB.
Não consegui achar o que está faltando para ter meu EJB protegido com aquele módulo JAAS configurado no passo 1.
A aplicação é empacotada num EAR, com os médulos EJB (jar) e Web (WAR) dentro.