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?
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
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"));
Avez-vous essayé d'appeler getUserPrincipal () depuis HttpServletRequest?
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;
}
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));
}
def springSecurityService
def roles = springSecurityService.getAuthentication (). getAuthorities ()