Glassfish + JAAS JDBCRealm + Netbeans Enterprise Project + EJB annotations

5 respostas
duodecimo

Por acaso alguem saberia me dar uma dica de como configurar segurança
para usar via annotations em EJBś em um projeto enterprise c/ JAAS
JDBCRealm no Glassfish?
Tenho um JDBCRealm chamado security (não é default) que uso com
sucesso na camada web, configurando a segurança em GlassFish:sun-
web.xml.

Parece que para usar annotations em EJB’s (tipo @DeclaredRoles(…) e
depois @RolesAllowed(…)) tenho que configurar a segurança no modulo
ejb-jar. Tentei colocar uma declaração security em um
arquivo de configuração que criei com o nome de sun-ejb-jar.xml.
No mesmo arquivo, tentei tambem colocar:

security

Mas nada funcionou, talvez eu tenha criado o sun-ejb-jar.xml da
maneira errada (ele não existia em meu projeto). O glassfish acusa
erro na tag quando faço o deploy.

Agradeço se alguem puder me ajudar, uso o Netbeans 6.9.1 (Java EE 6,
JSF 3.0).

5 Respostas

A

Olá duodecimo.

Sei que o post é antigo e na verdade nãio estou respondendo para sanar sua dúvidas, mas sim para pedir ajuda!

Estou desenvolvendo uma aplicação web e preciso urgentemente implementar JAAS. Dos zilhoes de artigos e posts que encontrei na rede, o seu ([url]https://bitbucket.org/duodecimo/agenda/wiki/projetoAgendaGlassFishJAAS[/url] e [url]https://bitbucket.org/duodecimo/agenda/wiki/projetoAgendaJAAS[/url]) foi o melhor que eu encontrei e estou seguindo-os utilizado os mesmos frameworks.

Porém não funcionou muito bem. Fiz tudo descrito no tutorial, mas quando informo login e senha (para que seja feita a validação) apresenta o seguinte erro:
GRAVE: SEC1112: Cannot validate user [teste] for JDBC realm.    
AVISO: Web login failed: Login failed: javax.security.auth.login.LoginException: Security Exception
Parece ser algum problema com o acesso ao banco de dados, mas o mapeamento (na minha visão) está ok. O meu banco possui várias tabelas, mas as que são necessarias para a validação são as seguintes:
-------------------------------------------  
                  usuario                               
-------------------------------------------  
iduser: Long (PK)  
...  
loginuser: character varying(50)  
senhauser: character varying(50)  
...  
idgrupo: Long (FK)  
-------------------------------------------
e
-------------------------------------------  
              grupousuario                               
-------------------------------------------  
idgrupo: Long (PK)  
nomegrupo: character varying(50)   
-------------------------------------------
e as configurações de realm no glassfish são estas:
Nome da classe: com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm  
Contexto do JAAS: jdbcRealm  
JNDI: DB2Saude  
Tabela de usuários: usuario  
Coluna de nomes de usuários: loginuser  
Coluna de senhas: senhauser  
Tabela de grupos: grupousuario  
Coluna de nomes de grupos: nomegrupo
Preciso muito de ajuda... Agradecido!
duodecimo

Alan,

Só conferindo:

A tabela de grupo precisa ter chava primária composta, ambas do tipo String, sendo o primeiro campo o usuario (pode ser o nome, ou o apelido, ou ainda o login …) e o segndo campo o grupo (pode ser o nome do grupo).
Evidentemente, a tabela do usuário deve ter chave primária também tipo String, em concordância com o primeiro campo da tabela de grupo.

Será que isto ajuda?

A

duodecimo,

Ajudou muito sim! Tenho certeza que é isso o que estava faltando.
Só tem um problema: a minha aplicação já está montada sobre a atual estrutura de banco de dados, onde iduser(na tabela usuário) é chave primária e isso não pode ser alterado.

Uma solução que pensei, seria criar na tabela “usuario” uma chave primária composta, como em “grupousuario”, onde iduser[Long] e loginuser[String] formassem a PK. Resolveria o meu problema? E isso poderia afetar o funcionamento/lógica da aplicação de alguma forma?

Outra coisa que também imaginei (não sei se muito correto) seria criar outra tabela “usuarioAuth” com o campo login, somente para fazer a autenticação. Ela herdaria (ou um simples n…1) de “usuário”, e se relacionaria com “grupousuario”. Quando um usuário for registrado no sistema, a inserção de dados ocorreria nas duas tabelas.

O que acha mais viável? Teria outra solução?

Só mais uma coisa: Não entendi este relacionamento entre usuario e grupo.
Um usuario pode estar em vários grupos, mas um grupo pode conter apenas um usuário. É isso mesmo?

Muito agradecido pela sua atenção!

duodecimo

Alan,

Infelizmente este relacionamento entre as tabelas parece ser exigência do JDBCRealm, portanto, ele tem que ser implementado desta forma.
Na verdade, muita gente tem dificuldades (eu tive) para implementar JAAS com JDBCRealm até entender isso.
Quem sabe vc cria uma tabela espelho só para os logins, e garente que ela fique sincronizada com a original.
O relacionamento na prática é muitos para muitos, pois como a chave em grupo é usuário + grupo, um usuário pode ter vários grupos, e um grupo pode ter vários usuários.
Só não dá para repetir os mesmos usuario e grupo. O que ocorre apenas é redundância na inclusão dos nomes dos grupos. Se o relacionamento fosse normalizado seria melhor, mas, novamente, a implementação do JAAS com o JDBCRealm está assim …

A

duodecimo,

Desculpa a demora na resposta…
Valiosas explicações! Tentei a dias entender isso e agora as coisas ficaram claras.
Estou tentando fazer esta tabela espelho (que você disse) no postgresSQL 8.3, mas por enquanto não encontrei nada satisfatório. Já trabalhou com isso no postgres?

De qualquer forma, estou muito agradecido com sua ajuda.
Vlw mesmo!

Criado 18 de abril de 2011
Ultima resposta 21 de out. de 2011
Respostas 5
Participantes 2