2008-12-01 6 views
1

Je travaille sur une application j2ee existante et je suis obligé de supprimer certains appels de méthode spécifiques au fournisseur du code.Comment obtenir des informations utilisateur dans un bean session sans état

Les daos derrière une façade de session effectuent des appels dans le conteneur ejb pour obtenir l'ID et le mot de passe de l'utilisateur - afin de se connecter à la base de données. Identifiant de l'utilisateur et mot de passe du contexte initial utilisé pour se connecter au serveur.

Je suis en mesure d'obtenir le code d'utilisateur en utilisant sessionContext.getCallerPrincipal()

Y at-il de toute façon à obtenir les SECURITY_CREDENTIALS utilisés sur la connexion du serveur ou, est-il un moyen de transmettre des informations de la connexion du serveur dans les EJB (ils sont tous des beans de session sans état).

Ceci est une grande application avec un client riche et une interface Web, et dans un monde parfait, je serais heureux de revenir en arrière et de ré-architecturer la solution entière pour utiliser la sécurité J2EE etc - mais malheureusement, n'est pas réaliste.

Répondre

0

Normalement, le modèle de sécurité Java EE ne permet pas la récupération du mot de passe utilisateur, pour des raisons de sécurité. Mais cela dépend de la mise en œuvre. Certains fournisseurs proposent des méthodes pour récupérer ce type d'informations, mais si vous comptez sur de telles implémentations, sachez que la portabilité de l'application sera compromise.

Une approche courante consiste à écrire un filtre de servlet pour intercepter la demande de connexion et enregistrer une copie des informations d'identification, à utiliser ultérieurement. Si votre application n'utilise pas l'infrastructure de sécurité Java EE, cela peut être facilement implémenté. En effet, certains fournisseurs vous empêchent de filtrer une servlet d'authentification.

1

Je ne peux pas vous donner une solution générique, mais c'est ce qui a fonctionné pour nous. Nous avons le serveur d'application se connecter à LDAP en tant qu'utilisateur spécifique qui a la possibilité de demander des informations d'identification pour d'autres utilisateurs. Ensuite, nous avons un code de sécurité générique que nous pouvons utiliser pour demander des informations d'identification à l'intérieur des beans session, en fonction de l'identité des utilisateurs à partir de leur connexion initiale (comme vous le faites via getCallerPrincipal()).

Nous plaçons également l'identité des utilisateurs dans une variable locale de threads, de sorte que les classes de la chaîne d'appel de l'EJB ne doivent pas nécessairement être "conscientes du conteneur". Ils accèdent simplement à l'identité à partir du thread local et utilisent les classes de sécurité pour rechercher des informations de profil utilisateur. Cela facilite également la modification de l'implémentation pour les tests, ou même quelque chose d'autre que les recherches LDAP.

D'autres fonctionnalités que nous avons créées étaient un JDBCServiceLocator qui récupère les connexions avec l'utilisateur/mot de passe pour l'utilisateur actuel. Le développeur n'a donc pas besoin de coder explicitement les recherches de sécurité.

0

Robin,

Cela ressemble à ce que j'avais prévu. J'ai pensé que je ferais un appel juste après une connexion au serveur réussie pour charger les informations d'identification dans une variable threadLocal sur ma classe de connexion. J'espérais qu'il y avait un moyen plus facile - mais je suppose que non.

Questions connexes