Dificuldade com JAAS no JBoss com EJB 3.0

16 respostas
danieldestro

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:

&lt?xml version="1.0"?&gt
<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.

16 Respostas

danieldestro

Depois de fazer isso tudo funcionar, meu objetivo é ter pacotes EAR com módulos (serviços) EJB (Session Façade), que poderão ser reusados em outros aplicativos web. Por isso quero proteger meus EJBs com acesso autorizado.

danieldestro

Estranho também que eu não achei a anotação @DeclareRoles no JBoss 4.0.4-GA.

danieldestro

Quando adiciono o seguinte arquivo jboss.xml

&lt?xml version="1.0"?&gt <jboss> <security-domain>java:/jaas/exemplo1</security-domain> </jboss>

ao jar do meu EJB, ocorre o seguinte erro quando eu acesso uma página que faz o uso do meu EJB:

<blockquote>ERROR [UsersRolesLoginModule] Failed to load users/passwords/role files

java.io.IOException: No properties file: users.properties or defaults: defaultUsers.properties found

at org.jboss.security.auth.spi.Util.loadProperties(Util.java:313)

at org.jboss.security.auth.spi.UsersRolesLoginModule.loadUsers(UsersRolesLoginModule.java:186)

at org.jboss.security.auth.spi.UsersRolesLoginModule.createUsers(UsersRolesLoginModule.java:200)

at org.jboss.security.auth.spi.UsersRolesLoginModule.initialize(UsersRolesLoginModule.java:127)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

</blockquote>
P

O annotation que vc deve usar no EJB é:

@SecurityDomain(“exemplo1”)

O annotation @RolesAllowed(“yyy”) deve ser usado no método que você quer proteger.

Utilizei uma configuração parecida com a sua e funcionou normalmente.

danieldestro

pedro_ednardo:
O annotation que vc deve usar no EJB é:
@SecurityDomain(“exemplo1”)

Então o Tutorial da Sun está errado?
http://java.sun.com/javaee/5/docs/tutorial/doc/Security-JavaEE2.html#wp556542

De qualquer modo, o JBoss parece não me fornecer a annotation @DeclareRoles. Não achei em jar ou pacote nenhum.

P

Não deve estar errado.

O annotation SecuriryDomain é do JBoss. Não sei como isso é feito em outros AS’s.

Quanto ao annotation javax.annotation.security.DeclareRoles, eu nunca usei, portanto não posso ajudá-lo.

Ednardo

danieldestro

Você chegou a configurar o jboss.xml?

danieldestro

Anotando com @SecurityDomain(“exemplo1”) e NÃO fornecendo a config do jboss.xml, FUNCIONA!

Que droga! Não queria configurar isso nos EJBs.

Tópicos relacionados:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=91989
http://forum.java.sun.com/thread.jspa?threadID=773530&messageID=4405904#4405904

E só para constar. Quando você usa @RolesAllowed na definição da classe, quer dizer que toda a classe (ejb) precisa daquela(s) role(s). Se você usar em um método específico, você define a(s) role(s) somente para aquele método.

danieldestro

Segundo o pessoal postou no fórum do JBoss, pode-se ainda omitir a annotation @SecurityDomain e fornecer o arquivo jboss.xml com o nome JNDI modificado, com apenas o nome do domain.

Assim:

&lt?xml version=&quot;1.0&quot;?&gt &lt;jboss&gt; &lt;security-domain&gt;exemplo1&lt;/security-domain&gt; &lt;/jboss&gt;

Eu não testei, mas falaram que funciona!

P

Não usei o jboss.xml, apenas o @securityDomain.

Só precisei usar este xml para configurar o jaas no ejb2, mas aí resolvi migrar o projeto pro ejb3, pois configurar as roles utilizando o xml é desumano …

danieldestro

Mas é melhor definir o domain apenas uma vez no jboss.xml do que anotando todo e qualquer EJB.

Me diga uma coisa. Qual o cenário de utilização de JAAS no seu projeto? Usam SSO? Fazem acesso remoto?

Obrigado!

Luca

Olá

Daniel, muito bom e muito didático você postar suas dúvidas desta forma meio incremental.

Achei um artigo meio antigo obre JAAS e JBoss mas que faço questão de passar para você porque lá na OciWeb tem um monte de artigos bons sobre várias áreas de Java.

[]s
Luca

P

Não conhecia o SSO, mas utilizamos um conceito parecido: Temos um módulo de controle de acesso idependente, com usuários, roles e grupos; e utilizamos o JAAS para controlar o acesso (utilizando a base do módulo de acesso) em cada nova aplicação que desenvolvemos.

Achei interessante a idéia de duas aplicações compartilharem informações, como no exemplo que vi em http://www-128.ibm.com/developerworks/java/library/j-gss-sso/
onde o sistema de vendas precisa de informações do sistema de controle de estoque …

Você já usou SSO ou possui algum material que poderia me passar? Quero aprender mais sobre isso.

Obrigado

Ednardo

danieldestro

SSO simplesmente permite que várias aplicações tenham login único, sem precisar ficar gerenciando vários usuários, nem mesmo fazer o mesmo login diversas vezes em apps diferentes.

Tem opções Open Source para SSO, como o JOSSO: http://www.josso.org/

Mais infos sobre SSO:

Me diz uma coisa… Isso que você chamou de módulo de controle de acesso independente, seria uma implementação da interface LoginModule, que vocês mesmos fizeram? Cada app sua tem um login diferente?

P

E você já possui alguma coisa rodando que usa o SSO?

danieldestro

Temos 30 sistemas usando um sistema de SSO que nós mesmos criamos. Nada de JAAS envolvido.

Esse sistema central faz a autenticação e as libs em cada app faz a autorização.

Criado 2 de outubro de 2006
Ultima resposta 17 de out. de 2006
Respostas 16
Participantes 3