Login com EJBs  XML
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Autor Mensagem
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

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!

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 210
Localização: São Paulo
Offline

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

Felipe de Alencar Albuquerque
[MSN]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

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


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?



Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

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

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

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


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 !

This message was edited 1 time. Last update was at 18/12/2007 08:05:11


Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
keller
GUJ Master
[Avatar]

Membro desde: 12/11/2003 16:24:00
Mensagens: 1817
Localização: Auckland - NZ
Offline


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

Guilherme I. Keller (Gui)
Diploma in Web Development and Desktop Publishing
SCJA | SCJP | SCWCD | SCBCD | CSM
"Test it, before it test you."
http://flickr.com/guikeller
[WWW] [MSN]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

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


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.

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
chicobento
JavaGuru
[Avatar]

Membro desde: 14/06/2004 01:44:04
Mensagens: 226
Localização: Campinas
Offline

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 ?


SCEA 5
[MSN]
Luiz_Gustavo
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

chicobento wrote: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


Abraços e obrigado!

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
rodrigob
Entusiasta Java

Membro desde: 17/08/2007 20:40:04
Mensagens: 16
Offline

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
Virtual Machine Man
[Avatar]

Membro desde: 30/04/2005 12:55:11
Mensagens: 518
Localização: Assis
Offline

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!

Analista e Desenvolvedor de Sistemas
http://luizgustavoss.blogspot.com/
http://luizgustavoss.wordpress.com/
http://www.linkedin.com/in/luizgustavoss
Procurando uma especialização em Java, SOA e Android? Conheça a TNT Educacional

[Email] [WWW]
rodrigob
Entusiasta Java

Membro desde: 17/08/2007 20:40:04
Mensagens: 16
Offline

rodrigob wrote:
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.
 
Índice dos Fóruns » Java Enterprise Edition (Java EE)
Ir para:   
Powered by JForum 2.1.8 © JForum Team