Problemas, muitos problemas

Olá pessoal !!!

Aqui onde eu trabalho existe o requisito de que cada usuário da aplicação é um usuário do banco. Tive grandes problemas com isso, pois estou utilizando Hibernate. Para resolver este problema eu criei um SessionContext e um ConnectionProvider personalizado. Esta solução atendeu minhas necessidades em relação a utilização do Hibernate, agora meu problema esta sendo pegar o usuário logado e obter a conexão para o mesmo. Estou utilizando o JAAS para autenticação de usuário, minha pergunta á:

  • Tem como dentro do meu ConnectionProvider customizado (uma classe java simples) eu pegar o usuário logado no JAAS ?

Ultima informação: estou utilizando JSF, EJB 2.1, Hibernate

Por favor, todas as ajudas soluções e orações são validas,
obrigado

dgouvea, esse material pode ajudar :
http://www.argonavis.com.br/cursos/java/j530/j530_13_Security.pdf

Abraço.

Algo que vc. pode fazer é usar Uma classe helper que utilize um ThreadLocal para passar usuáro/senha que vc. usou na hora de loga nno JAAS até o seu ConnectionProvider.

Aliás, com esta “solução de engenharia”, vc. nem precisaria de um ConnectionProvider. Em um projeto que estou trabalhando, resolvi usar o ant para simplificar a implementação de jobs ETL. Como tinha alguns SQLs no meio do caminho a princípio tinha usuário/senha/etc no ant. Não gostei do resultado e resolvi implementar um pseudo-driver JDBC.

Na verdade, acabei implementando dois. Um deles funciona como um adaptador para JNDI, ou seja, ao usar uma url do tipo “jdbc:jndi:xxxx”, o driver faz lookup do datasource no jndi usando xxxx e retorna uma conexão. Funciona legal e não preciso mais ter senhas nem informações travadas no script. Mas isto ainda não resolvia todos os problemas. Os tasks assumiam que era possível brincar à vontade com transações, algo que não posso permitir quando o script for executado por um EJB com CMTs. A solução foi criar outro driver que retorna uma conexão previamente armazenada no thread corrente logo na entrada do EJB, a qual é embrulhada em um adaptador que faz ouvidos de mercador às chamadas de commit(), rollback() e assemelhadas.

Olá psevestre,

Quando li o seu POST tinha acabado de implementar esta solução utilizando o ThradLocal. Funcionou, consegui o resultado esperado. Obrigado pela dica.

Mas agora tenho um outro problema, como sempre, um puxa o outro. O JAAS do JBoss não repassa minha classe Principal, sendo assim quando eu invoco request.getUserPrincipal() ou context.getCallerPrincipal() ele me retorna um SimplePrincipal do JBoss, procurei em alguns lugares e vi que a implementação do JBoss é assim mesmo.
O problema é que resolvi passar no getName do meu Principal o login e a senha, separados por “:”. O problema é que o JBoss está ignorando o meu Principal totalmente. Ele utiliza o meu LoginModule para autenticar o usuário mas não coloca as informações do meu Principal no usuário logado.

Não sei o que fazer :frowning:

Pessoal consegui solucionar o problema… :slight_smile:

No JBoss tem uma classe SecurityAssociation, onde posso recuperar o usuário logado e sua senha.

String usuario = SecurityAssociation.getPrincipal().getName();
String senha = SecurityAssociation.getCredential().toString();

Obrigado pela ajuda de todos,
Abraços