web-dev-qa-db-fra.com

Comment utiliser <sec: authorize access = "hasRole ('ROLES)"> pour vérifier plusieurs rôles?

Je souhaite afficher certains contenus conditionnellement basés sur des rôles à l'aide de taglibs Spring Security JSP. Mais au printemps, Security 3.1.x vérifie un seul rôle.

Je peux utiliser mais ifAllGranted est obsolète.

De l'aide?

43

Il existe une expression de sécurité spéciale dans la sécurité de printemps:

hasAnyRole (liste de rôles) - true - si l'un des rôles spécifiés a été attribué à l'utilisateur (donné sous forme de liste de chaînes séparée par des virgules).

Je ne l'ai jamais utilisé mais je pense que c'est exactement ce que vous recherchez.

Exemple d'utilisation:

<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
    ...
</security:authorize>

Voici un lien vers la documentation de référence où les expressions de sécurité standard à ressort sont décrites. En outre, voici une discussion où j'ai décrit comment créer une expression personnalisée si vous en avez besoin.

76
dimas

La réponse de @ dimas ne concorde pas logiquement avec votre question. ifAllGranted ne peut pas être directement remplacé par hasAnyRole.

Du Guide de migration de Spring Security 3—> 4 :

Vieux:

<sec:authorize ifAllGranted="ROLE_ADMIN,ROLE_USER">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

Nouveau (SPeL):

<sec:authorize access="hasRole('ROLE_ADMIN') and hasRole('ROLE_USER')">
    <p>Must have ROLE_ADMIN and ROLE_USER</p>
</sec:authorize>

Si vous remplacez ifAllGranted directement par hasAnyRole, Spring évaluera l'instruction en utilisant un OR au lieu d'un AND. C'est-à-dire que hasAnyRole retournera true si le principal authentifié contient au moins un des rôles spécifiés, alors que Spring est désormais obsolète à partir de Spring Security 4 ifAllGranted la méthode n'a retourné que true si le principal authentifié contenait tout des rôles spécifiés.

TL; DR : pour reproduire le comportement de ifAllGranted à l'aide du nouveau langage d'expression d'authentification de Spring Security Taglib, la hasRole('ROLE_1') and hasRole('ROLE_2') motif doit être utilisé.

5
acidnbass

j'ai utilisé hasAnyRole('ROLE_ADMIN','ROLE_USER') mais je commençais à obtenir une création de bean en dessous de l'erreur

Error creating bean with name     'org.springframework.security.web.access.intercept.FilterSecurityInterceptor#0': Cannot create inner bean '(inner bean)' of type [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource] while setting bean property 'securityMetadataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#2': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.security.web.access.expression.ExpressionBasedFilterInvocationSecurityMetadataSource]: Constructor threw exception; nested exception is Java.lang.IllegalArgumentException: Expected a single expression attribute for [/user/*]

alors j'ai essayé

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" et ça fonctionne très bien pour moi.

comme l'un de mes utilisateurs est admin ainsi que l'utilisateur.

pour cela, vous devez ajouter use-expressions="true" auto-config="true" suivi de la balise http

<http use-expressions="true" auto-config="true" >.....</http>
1
Musaddique