2009-05-07 8 views
2

J'utilise Jbos AS 5 et le DatabaseServerLoginModule pour l'autorisation. J'ai ma politique d'application définie comme (par exemple, et non le code réel):Comment obtenir les rôles utilisateur dans Servlet?

<application-policy name = "jbossmq"> 
    <authentication> 
    <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" 
     flag = "required"> 
     <module-option name = "unauthenticatedIdentity">guest</module-option> 
     <module-option name = "dsJndiName">java:/MyDatabaseDS</module-option> 
     <module-option name = "principalsQuery">SELECT PASSWD FROM JMS_USERS WHERE USERID=?</module-option> 
     <module-option name = "rolesQuery">SELECT ROLEID, 'Roles' FROM JMS_ROLES WHERE USERID=?</module-option> 
    </login-module> 
    </authentication> 
</application-policy> 

Une fois que l'utilisateur est autorisé avec succès, comment puis-je récupérer les rôles d'utilisateur de mon servlet? Dans l'extrait de code ci-dessus, les rôles sont sélectionnés dans la base de données, mais où sont-ils stockés? En session !? Si oui, sous quelles variables de session?

De même, est-il possible d'utiliser conjointement l'authentification Ldap et l'autorisation de base de données dans JBoss?

Répondre

3

Clinton est fondamentalement bon, la méthode

boolean HttpServletRequest.isUserInRole(String role) 

peut être utilisé pour vérifier si un utilisateur a un certain rôles assignés. Cependant, cette méthode est destinée à vérifier les rôles J2EE définis par l'application (dans le descripteur EAR, le fichier application.xml).

Lors du déploiement ou du regroupement d'un descripteur spécifique à l'AS dans votre fichier EAR, vous devez spécifier le mappage des rôles utilisateur du serveur d'applications (ceux que vous définissez avec les principaux dans votre module de connexion) vers l'application J2EE. les rôles.

1

Je suis au courant de la méthode:

boolean HttpServletRequest.isUserInRole(String role) 

Je sais que cela ne vous donne pas une liste de tous les rôles, mais serait-il servir votre but?

1

Si le conteneur est compatible JACC l'extrait suivant pourrait fonctionner (au moins pour moi sur Glassfish 3.1.x)

Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container"); 
for (Principal principal : subject.getPrincipals()) { 
    LOG.debug("In subject: " + principal.getName()); 
} 

Le premier coup est (généralement) votre principal utilisateur et les autres ont tendance à être un groupe principaux. S'il vous plaît not pas que si vous connaissez le nom de la classe principal des groupes, vous pouvez le filtrer en appelant getPrincipals(Class<T> c) à la place.

Questions connexes