Login com EJBs

11 respostas
Luiz_Gustavo

Bom dia galera,

de que maneira vocês costumam implementar um processo de login, em uma aplicação EJB, sem ser com a utilização de REALMs.
Preciso fazer o processo de login, e identificar no EJB qual o usuário logado, para mudar em tempo de execução os parâmetros de conexão com o banco.
Em aplicações sem EJB, costumo colocar a informação do usuário na sessão, mas não sei como fazer isso usando EJBs… se é possível para os EJBs acessarem de alguma foram as informações das sessões.

Agradeço a quem puder ajudar!

Abraços!

11 Respostas

felipealbuquerque

Você não pode passar os dados de login por um TO e guardar num bean Stateful?

Luiz_Gustavo

Obrigado pela dica!

Eu cheguei a pensar nisso, mas se eu usar esta alternativa, de passar um TO com os valores, teria que fazer a chamada ao método que passa o TO antes de qualquer outro método, pois preciso que esta informação esteja no EJB Stateful antes da chamada de qualquer método, pois a execução de qualquer operação de banco tem que ser com uma conexão personalizada para o usuário atual.

Preciso criar na inicialização do EJB um EntityManager com essas informações, e usá-lo durante toda a vida útil do EJB (apenas um), caso contrário teria que criar um EM a cada chamada de método, o que fica inviável.

Se eu pudesse acessar uma variável de sessão, poderia criar o EntityManager na inicialização do EJB, sem a necessidade da chamada de um método.

Alguma idéia?

Luiz_Gustavo

Quando usado o esquema de Realm, tenho disponível no EJB, através do método getCallerPrincipal() do SessionContext, o Principal.
Preciso de algo parecido… acessível por algum recurso injetado.

[]'s

Luiz_Gustavo

Opa… criei um EJB Stateful de login (LoginBean) responsável por validar o login e guardar uma referência aos dados do usuário.
Queria ter acesso a este objeto (este especificamente) a partir dos outros EJBs, mas quando obtenho um EJB LoginBean por injeção, é criada uma nova instância, sem as informações iniciais.
Tem idéia de como posso obter sempre a mesma instância?

Mais uma vez obrigado !

keller

E porque tu não pode deixar os dados do usuario na sessão?

Luiz_Gustavo

Opa Keller, beleza?

Essa sessão a que você se refere sera a HttpSession?

Então, é que faz pouco tempo que estou trabalhando com EJBs e ainda não conheço todas as possibilidades.
Vou explicar a minha necessidade, e talvez você possa sugerir uma alternativa.

Cada usuário do sistema possui um usuário paralelo no banco de dados, e as operações de banco de cada usuário do sistema precisam ser feitas com seu usuário correspondente no banco de dados, pois as permissões são controladas no banco, através de triggers (trata-se de um sistema que já existia, e que está sendo refeito).
Essa regra não pode ser mudada, então a alternativa foi trocar, em tempo de execução, os dados da conexão. Faço isso passando um Map na construção do EntityManager.
Esses EntityManagers são criados em Beans Stateful, uma única vez.
Esses Beans Stateful cordenam o fluxo de tarefas, chamando outros Beans Stateless que executam as operações no banco. Para isso, os Beans Stateful iniciam as transações nos EntityManager que possuem, e passam para quaisquer Beans Stateless que seja necessário, para que executem as operações, e depois a transação é finalizada no Bean Stateful.
Precisei fazer toda essa gambiarra pois pegando os EntityManager através da EntityManagerFactory, perco a propagação de transação e de contexto de persistência.

Bom, diante desse cenário, a minha necessidade é garantir que a informação de qual usuário está logado esteja acessível aos Beans Stateful.
Ao fazer o login, eu obtenho um Entity referente ao usuário e guardo na HttpSession, pois assim ele está acessível aos Managed Beans.
O problema é fazer com que esse Entity chegue aos Beans Stateful.
Sei que a HttpSession está acessível a quaisquer Managed Beans, mas não conheço uma sessão equivalente que seja acessível tanto para os ManagedBeans quanto para os EJBs.
Não sei se é possível colocar isso no EJBContext, por exemplo.
O que estou fazendo atualmente, é criar um método em cada EJB Stateful, que recebe esse Entity e configura a EntityManager com as informações do usuário. O problema é que tenho que garantir que esse método seja chamado antes de qualquer outro. Essa abordagem não é nada flexível, pois se eu pudesse colocar a informação do usuário logado em uma área comum a todos os objetos, faria a inicialização do EntityManager num método @PostContruct do EJB, sem chamadas de configuração a partir do Managed Bean.

Putz, escrevi pra caramba, foi mal… mas é melhor explicar o contexto…

O que me sugere?

Obrigado pela atenção.

C

Não sei se entendí o problema, mas e se vc criar um filtro para a url de login que cria o Stateful e seta os dados do usuário nele e já o associa a sessão ?

Luiz_Gustavo

chicobento:
Não sei se entendí o problema, mas e se vc criar um filtro para a url de login que cria o Stateful e seta os dados do usuário nele e já o associa a sessão ?

Opa, beleza?

Então… inicialmente eu fiz um teste… criei um EJB Stateful para validar o login (LoginBean), e se fosse válido eu mantinha nele as informações do usuário atual.
Mas quando um outro EJB era utilizado, e precisava dessas informações para criar o EntityManager, ele obtinha uma referência ao LoginBean… o problema é que era criada uma nova instância… sendo que a instãncia que continha as informações era a primeira, usada para validar o login.
Eu obtinha essa referência por injeção… não sei se é esse o problema.

Enfim, também não consegui por esse caminho…

Se tiver alguma sugestão :smiley:

Abraços e obrigado!

R

Então conseguiu fazer dessa forma? Estava pensando em fazer algo parecido…

Pessoal é viável fazer dessa forma, armazenar dados de login em um Stateful (EJB3)?
A vantagem que eu vejo é ficar independente da HttpSession, e dessa forma os dados do usuário ficam disponiveis na camanda de negócio.

Mas não sei se tem alguma desvantagem, de performance, etc.

Abraços.

Luiz_Gustavo

Boa tarde,

então Rodrigo, acabamos deixando de lado o uso de EJB.
Mas antes que tivéssemos deixado de lado, usamos a abordagem de guardar a informação do usuário na sessão.
Ainda estamos fazendo isso com o uso de JPA apenas.

abraços!

R

rodrigob:

Pessoal é viável fazer dessa forma, armazenar dados de login em um Stateful (EJB3)?
A vantagem que eu vejo é ficar independente da HttpSession, e dessa forma os dados do usuário ficam disponiveis na camanda de negócio.

Mas não sei se tem alguma desvantagem, de performance, etc.

Abraços.

Alguém teria uma opinião sobre o assunto?

Obrigado,
Abraços.

Criado 17 de dezembro de 2007
Ultima resposta 2 de mai. de 2008
Respostas 11
Participantes 5