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
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.
dgouvea
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
dgouvea
Pessoal consegui solucionar o problema…
No JBoss tem uma classe SecurityAssociation, onde posso recuperar o usuário logado e sua senha.