JAAS com JBoss 5.1 não funciona

Olá pessoal, eu estou seguindo o material da CAELUM do curso de EJB que fiz, porém fazendo uso do JBoss 5.1. Uso o Derby para testes e criei as seguintes tabelas e registros:

[code]create table users
(username varchar(15) not null PRIMARY KEY,
password varchar(50) not null
);

create table roles
(username varchar(15) not null,
role varchar(15) not null
);

Alter table roles add primary key(username, role);

Insert into users values(?joao?, ?pass?);
Insert into roles values(?joao?, ?administrador?);
Insert into users values(?maria?, ?pass?);
Insert into roles values(?maria?, ?cliente?);
commit;[/code]

Criei no login-config dentro de default/conf o seguinte código:

<application-policy name="livraria"> <authentication> <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> <module-option name="dsJndiName">java:/DerbyDS</module-option> <module-option name="principalsQuery"> select password as Password from users where user like ? </module-option> <module-option name="principalsQuery"> select role, 'Roles' from roles where user like ? </module-option> </login-module> </authentication> </application-policy>

Meu EJB está anotado com @org.jboss.security.annotation.SecurityDomain;(“livraria”) e meu método com @javax.annotation.security.RolesAllowed(“administrador”). Meu cliente é o que segue abaixo:

[code] public static void main(String[] args) throws NamingException {
Properties env = new Properties();
env.setProperty(Context.SECURITY_PRINCIPAL, “maria”);
env.setProperty(Context.SECURITY_CREDENTIALS, “pass”);
env.setProperty(Context.INITIAL_CONTEXT_FACTORY,
“org.jboss.security.jndi.JndiLoginInitialContextFactory”);
InitialContext ctx = new InitialContext(env);
IGerenciadorLoja gerenciador =
(IGerenciadorLoja) ctx.lookup(“LivrariaII/GerenciadorLojaBean/remote”);

	System.out.println(gerenciador.listaLivros());
}[/code]

maria é cliente e não administrador, porém acessa o método normalmente. Alguém pode me auxiliar nisso?

Grato

Everton

Olá Everton, tudo bem?

Aparentamente tá tudo corretamente configurado. Dei uma olhada na documentacão e a configuracão do JAAS não mudou entre as versões 4.x e 5.x do JBoss.

Então deixa me perguntar:

Vc já testou o seu datasource independentemente do JAAS?
Quando vc sobe o JBoss, ele mostra alguma excecão?

Vc poderia tentar usar a uma outra configuracão JAAS já existente no login-config.xml que se chama “other” - só pra isolar o problema. Com ela vc usa dois arquivos de propriedades, user.properties e roles.properties, dentro da pasta src do seu projeto para definir usuários e roles. Tem uma breve explicacão sobre isso no login-config.xml.

Nico

Olá Nico. O Datasource funciona, pois consigo fazer inserts nele através de outro método no mesmo EJB. Era essa a pergunta não é?
Vou verificar sobre o properties e já dou retorno

Nico, tentei com os arquivos de propriedades e igualmente aceita o acesso. Pode me ajudar a resolver este problema?

Ola Everton

Posta os dois properties que voce fez pra gente ver. Verifica se, mesmo eles estando no src do seu projeto, se eles estao sendo copiados pro .jar deploiado (pra isso pegue o .jar/.ear, descompacte/visualize seus conteudos e confira se eles estao dentro do jar).

Se estiverem, ligue o jboss em debug mode, e verifique se durante o deploy da sua aplicacao ele esta encontrando os arquivos que voce setupou o acesso.

Sei que pode parecer besteira, mas só para ter certeza; na descrição da anotação em seu post vc colocou:

@org.jboss.security.annotation.SecurityDomain;(“livraria”)

Este “;” não esta no seu código, esta?

Não tem o “;” não. Seguem os arquivos

users.properties

joao=pass
maria=pass

roles.properties

joao=administrador
maria=cliente

Os properties estão no deploy sim. Note que estou fazendo uso do Eclipse, desta forma, o deploy ocorreu para o servidor que está no eclipse.

Obrigado por enquanto

oi everton

e o log em debug mode, o que esta acusando?

Everton

Faca mais um teste: no arquivo jmx-invoker-service.xml, e descomente essas linhas:

Oi Paulo, tirei o comentário, mas igual permite o acesso. Segue o log referente a criação do serviço do JAAS. Lembro que este código é de antes de eu retirar o comentário do elemento sugerido.

2010-06-14 20:11:46,997 DEBUG [org.jboss.system.ServiceCreator] (main) About to create bean: jboss.security:service=JaasSecurityManager with code: org.jboss.security.plugins.JaasSecurityManagerService
2010-06-14 20:11:47,023 DEBUG [org.jboss.system.ServiceCreator] (main) Created mbean: jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,023 DEBUG [org.jboss.system.ServiceConfigurator] (main) ServerMode set to true in jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,024 DEBUG [org.jboss.system.ServiceConfigurator] (main) SecurityManagerClassName set to org.jboss.security.plugins.JaasSecurityManager in jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,025 DEBUG [org.jboss.system.ServiceConfigurator] (main) DefaultUnauthenticatedPrincipal set to anonymous in jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,025 DEBUG [org.jboss.system.ServiceConfigurator] (main) DefaultCacheTimeout set to 1800 in jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,026 DEBUG [org.jboss.system.ServiceConfigurator] (main) DefaultCacheResolution set to 60 in jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,026 DEBUG [org.jboss.system.ServiceConfigurator] (main) DeepCopySubjectMode set to false in jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,026 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) setDeepCopySubjectMode=false
2010-06-14 20:11:47,028 DEBUG [org.jboss.system.ServiceController] (main) Creating service jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,028 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) Creating jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,028 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) Created jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,028 DEBUG [org.jboss.system.ServiceController] (main) starting service jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,028 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) Starting jboss.security:service=JaasSecurityManager
2010-06-14 20:11:47,037 DEBUG [org.jboss.security.SecurityAssociation] (main) Using ThreadLocal: false
2010-06-14 20:11:47,045 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) cachePolicyCtxPath=java:/timedCacheFactory
2010-06-14 20:11:47,047 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) SecurityProxyFactory=org.jboss.security.SubjectSecurityProxyFactory@e26d2e
2010-06-14 20:11:47,049 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) Registered PrincipalEditor, SecurityDomainEditor
2010-06-14 20:11:47,049 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) ServerMode=true
2010-06-14 20:11:47,049 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) SecurityMgrClass=class org.jboss.security.plugins.JaasSecurityManager
2010-06-14 20:11:47,049 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) CallbackHandlerClass=class org.jboss.security.auth.callback.JBossCallbackHandler
2010-06-14 20:11:47,049 DEBUG [org.jboss.security.plugins.JaasSecurityManagerService] (main) Started jboss.security:service=JaasSecurityManager

Segue link para arquivo completo de log: http://drop.io/evertonfoz/asset/server-log

A query de roles está como principalsQuery. Tenta ai!

Pedro, poderia ser mais claro? Não entendi o que tem que mudar. Colocar principalsRole?

Tenta colocar como rolesQuery o nome da option de roles. As duas estão como principalsQuery.