2010-08-04 5 views
1

dans notre application, nous utilisons JSF & EJB 3.0 (EclipseLink 2.0). Nous devons utiliser l'autorisation de proxy Oracle pour chaque connexion dans nos beans session sans état. Pour cela, nous devons obtenir un nom d'utilisateur DB pour se connecter via proxy. Le nom d'utilisateur de la base de données est construit à partir du nom d'utilisateur authentifié JSF par une règle.comment obtenir le nom d'utilisateur app JSF de bean session sans état

Voici un article sur le sujet http://blogs.oracle.com/olaf/2010/04/using_oracle_proxy_authenticat.html

Ainsi, lorsqu'un utilisateur authentifié appelle une méthode de bean géré JSF qui ce Tournons appelle une méthode de bean session son nom d'utilisateur doit être en quelque sorte passé à bean session.

À l'heure actuelle, j'ai deux solutions pas très bonnes: - passer le nom d'utilisateur en tant que paramètre dans chaque méthode de session bean (pas très soigné mais ça va marcher); - la solution de l'article ci-dessus: utiliser la variable membre de la classe session bean pour stocker le nom d'utilisateur (pas thread sûr et potentiellement dangereux)

P.S. J'ai trouvé une solution qui utilise des variables locales de thread: _http: //www.adam-bien.com/roller/abien/entry/how_to_pass_context_with Cela fonctionne très bien, mais il y a toujours un problème. J'ai besoin de mettre le nom d'utilisateur actuel dans chaque bean géré par session jsf avant chaque appel au bean session ejb car il doit être dans le même thread.

Répondre

2

Si vos utilisateurs sont authentifiés par le conteneur, vous pouvez accéder au nom d'utilisateur dans le ejb en utilisant une instance injectée de javax.ejb.SessionContext comme ceci:

@Resource 
private SessionContext context; 

private String getCurrentUsername() { 
    return context.getCallerPrincipal().getName(); 
} 

Edit: Cela fonctionne si l'authentification est configuré web.xml via les éléments login-config et security-constraint. Si vous procédez vous-même à l'authentification, vous pouvez utiliser un ServletFilter et un HttpServletRequestWrapper qui remplace les méthodes getUserPrincipal, getRemoteUser et isUserInRole (testées dans glassfish).

Si vous gérez l'authentification dans un bean jsf, cela ne fonctionnera probablement pas car l'ejb sera déjà initialisé et injecté. Vous pouvez cependant également créer un ejb scoped de session qui ne contient que le nom d'utilisateur et injecter ce bean dans vos beans sans état.

+0

Merci beaucoup, Jörn. Votre solution me semble très nette. P.S. Pouvez-vous me dire quand SessionContext ne contiendra pas le nom d'utilisateur actuel de la couche Web? – Andrey

Questions connexes