web-dev-qa-db-fra.com

comment obtenir les rôles d'utilisateur actuels à partir de Spring Security 3.1

J'ai chargé les rôles de la base de données pour l'utilisateur actuel. Et je peux accéder au rôle utilisateur avec l'expression de sécurité printanière dans jsp et cacher les options et les URL non autorisées avec hasRole. Maintenant, je voulais l'avoir dans le servlet et l'afficher dans les journaux (ou le stocker dans la session d'objet utilisateur). Comment pouvons-nous y parvenir?

19
Bhas

Vous pouvez essayer quelque chose comme ça:

Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>)    SecurityContextHolder.getContext().getAuthentication().getAuthorities();

Vous avez la collection de rôles dans la variable autorités.

Mise à jour: Correction d'une faute de frappe de GrantedAuthority generic

58
Dani

Si vous développez sur Java 8, cela devient plus facile.

Pour obtenir tous les rôles d'utilisateur:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

Set<String> roles = authentication.getAuthorities().stream()
     .map(r -> r.getAuthority()).collect(Collectors.toSet());

pour vérifier si l'utilisateur a un rôle particulier, par ex. ROLE_USER :

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

boolean hasUserRole = authentication.getAuthorities().stream()
          .anyMatch(r -> r.getAuthority().equals("ROLE_USER"));
14
Bogusz

Avez-vous essayé d'appeler getUserPrincipal () depuis HttpServletRequest?

7
maximdim

Pour compléter les deux réponses ...

Voici une implémentation de sécurité Spring de getUserPrincipal, de sorte que vous pouvez voir que getUserPrincipal est en fait SecurityContextHolder

public Principal getUserPrincipal() {
        Authentication auth = getAuthentication();

        if ((auth == null) || (auth.getPrincipal() == null)) {
            return null;
        }    
        return auth;
}

//And the getAuthentication
private Authentication getAuthentication() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    if (!trustResolver.isAnonymous(auth)) {
        return auth;
    }
    return null;
}
2
Alireza Fattahi

Si créé une fonction hasRole personnalisée pour mon projet.

public static boolean hasRole (String roleName)
{
    return SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
            .anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals(roleName));
}
1
Sebastian Ullrich

def springSecurityService

def roles = springSecurityService.getAuthentication (). getAuthorities ()

0
Abhishek