Comment vérifier les droits ou autorisations des utilisateurs dans Java Code? Par exemple - Je veux afficher ou masquer le bouton pour l'utilisateur en fonction du rôle. Il y a des annotations comme:
@PreAuthorize("hasRole('ROLE_USER')")
Comment le faire en code Java? Quelque chose comme :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Piotr Gwiazda
la source
la source
SecurityContextHolderAwareRequestWrapper
instance. Vous pouvez l'améliorer en expliquant comment l'obtenir et en clarifiant un peu plus la réponse elle-même.vous pouvez utiliser la méthode isUserInRole de l'objet HttpServletRequest.
quelque chose comme:
la source
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
pour obtenir la demande? :)Au lieu d'utiliser une boucle pour trouver l'autorité à partir de UserDetails, vous pouvez faire:
la source
Vous pouvez récupérer le contexte de sécurité, puis l'utiliser:
la source
SecurityContextHolder.getContext()
n'est jamaisNULL
, consultez la documentation. Ainsi, vous pouvez éviter de vérifier le contexteNULL
.Vous pouvez implémenter une méthode hasRole () comme ci-dessous - (Ceci est testé sur Spring Security 3.0.x pas sûr des autres versions.)
la source
SecurityContextHolder.getContext().getAuthentication()
peut récupérernull
. Peut-être que vous ajoutez un chèque?J'utilise ceci:
la source
Vous pouvez obtenir de l'aide de la classe AuthorityUtils . Vérification du rôle en tant que one-liner:
Attention: cela ne vérifie pas la hiérarchie des rôles, si elle existe.
la source
La réponse de JoseK ne peut pas être utilisée lorsque vous êtes dans votre couche de service, où vous ne voulez pas introduire de couplage avec la couche Web de la référence à la requête HTTP. Si vous envisagez de résoudre les rôles dans la couche de service, la réponse de Gopi est la voie à suivre.
Cependant, c'est un peu long. Les autorités sont accessibles directement à partir de l'authentification. Par conséquent, si vous pouvez supposer que vous avez un utilisateur connecté, ce qui suit le fait:
la source
La plupart des réponses manquent certains points:
Le rôle et l'autorité ne sont pas la même chose au printemps. Voir ici pour plus de détails.
Les noms de rôle sont égaux à
rolePrefix
+authority
.Le préfixe de rôle par défaut est
ROLE_
cependant configurable. Regardez ici .Par conséquent, une vérification de rôle appropriée doit respecter le préfixe de rôle s'il est configuré.
Malheureusement, la personnalisation du préfixe de rôle dans Spring est un peu piratée, dans de nombreux endroits, le préfixe par défaut
ROLE_
est codé en dur, mais en plus de cela, un bean de typeGrantedAuthorityDefaults
est vérifié dans le contexte Spring, et s'il existe, le préfixe de rôle personnalisé il a est respecté.En rassemblant toutes ces informations, une meilleure implémentation du vérificateur de rôle serait quelque chose comme:
la source
Curieusement, je ne pense pas qu'il existe une solution standard à ce problème, car le contrôle d'accès de sécurité par ressort est basé sur l'expression et non sur Java. vous pouvez vérifier le code source de DefaultMethodSecurityExpressionHandler pour voir si vous pouvez réutiliser quelque chose qu'ils font là-bas
la source
Mieux vaut tard que jamais, laissez-moi mettre ma valeur de 2 cents.
Dans le monde JSF, dans mon bean géré, j'ai fait ce qui suit:
Comme mentionné ci-dessus, je crois comprendre que cela peut être fait de la manière suivante:
la source
Cela vient en quelque sorte de la question de l'autre côté, mais j'ai pensé que je la jetterais car je devais vraiment fouiller sur Internet pour le savoir.
Il y a beaucoup de choses sur la façon de vérifier les rôles, mais pas beaucoup de dire ce que vous vérifiez réellement quand vous dites hasRole ("bla")
HasRole vérifie les autorités accordées pour le principal actuellement authentifié
Donc vraiment quand vous voyez hasRole ("blah") signifie vraiment hasAuthority ("blah") .
Dans le cas que j'ai vu, vous faites cela avec une classe qui implémente UserDetails qui définit une méthode appelée getAuthorities. En cela, vous en ajouterez essentiellement
new SimpleGrantedAuthority("some name")
à une liste basée sur une logique. Les noms de cette liste sont les éléments vérifiés par les instructions hasRole.Je suppose que dans ce contexte, l'objet UserDetails est le principal actuellement authentifié. Il y a de la magie qui se produit dans et autour des fournisseurs d'authentification et plus particulièrement dans le gestionnaire d'authentification qui rend cela possible.
la source
hasRole("bla")
équivaut désormais àhasAuthority("ROLE_bla")
.La réponse @gouki est la meilleure!
Juste un conseil sur la façon dont le printemps fait vraiment cela.
Il existe une classe nommée
SecurityContextHolderAwareRequestWrapper
qui implémente laServletRequestWrapper
classe.Le
SecurityContextHolderAwareRequestWrapper
remplaceisUserInRole
et recherche l'utilisateurAuthentication
(qui est géré par Spring) pour savoir si l'utilisateur a un rôle ou non.SecurityContextHolderAwareRequestWrapper
le code est comme:la source
Ces deux annotations ci-dessous sont égales, "hasRole" ajoutera automatiquement le préfixe "ROLE_". Assurez-vous d'avoir la bonne annotation. Ce rôle est défini dans UserDetailsService # loadUserByUsername.
ensuite, vous pouvez obtenir le rôle dans le code java.
la source
Dans notre projet, nous utilisons une hiérarchie des rôles, alors que la plupart des réponses ci-dessus visent uniquement à vérifier un rôle spécifique, c'est-à-dire ne vérifieraient que le rôle donné, mais pas ce rôle et remonter la hiérarchie.
Une solution pour cela:
RoleHierarchy est défini comme un bean dans spring-security.xml.
la source
Sur votre modèle utilisateur, ajoutez simplement une méthode 'hasRole' comme ci-dessous
Je l'utilise généralement pour vérifier si l'utilisateur authentifié a le rôle d'administrateur comme suit
la source
Les rôles des utilisateurs peuvent être vérifiés des manières suivantes:
Utilisation des méthodes statiques d'appel dans SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Utilisation de HttpServletRequest
la source
Mon approche avec l'aide de Java8, passer des rôles séparés par une virgule vous donnera vrai ou faux
la source