Comment utiliser pour vérifier plusieurs rôles?

Je souhaite afficher certains contenus en fonction des rôles à l’aide des balises JSP de Spring Security. Mais dans Spring Security 3.1.x, il ne vérifie qu’un seul rôle.

Je peux utiliser mais ifAllGranted est déconseillé.

De l’aide?

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

hasAnyRole (liste de rôles) – true si l’utilisateur s’est vu atsortingbuer l’un des rôles spécifiés (sous la forme d’une liste de chaînes séparées par des virgules).

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

Exemple d’utilisation:

 ...  

Voici un lien vers la documentation de référence où les expressions de sécurité à ressort standard 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.

La réponse de @dimas n’est pas logiquement cohérente avec votre question. ifAllGranted ne peut pas être directement remplacé par hasAnyRole .

A partir du guide de migration de Spring Security 3 -> 4 :

Vieux:

  

Must have ROLE_ADMIN and ROLE_USER

Nouveau (SPeL):

  

Must have ROLE_ADMIN and ROLE_USER

En ifAllGranted directement ifAllGranted par hasAnyRole , Spring évaluera l’instruction à l’aide d’un OR au lieu d’un AND . En d’autres hasAnyRole , hasAnyRole renvoie true si le principal authentifié contient au moins un des rôles spécifiés, alors que la méthode ifAllGranted Spring (désormais obsolète à partir de Spring Security 4) ne renvoie true si le principal authentifié contient tous les rôles spécifiés.

TL; DR : Pour répliquer le comportement de ifAllGranted aide du nouveau langage d’expression d’authentification de Spring Security Taglib, le hasRole('ROLE_1') and hasRole('ROLE_2') doivent être utilisés.

J’ai utilisé hasAnyRole('ROLE_ADMIN','ROLE_USER') mais je hasAnyRole('ROLE_ADMIN','ROLE_USER') création de beans sous 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 atsortingbute for [/user/*] 

alors j’ai essayé

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" et ça marche bien pour moi.

comme l’un de mes utilisateurs est aussi bien administrateur que utilisateur.

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

 ..... 

L’utilisation de hasAnyRole sur la page JSP peut provoquer une exception lors du traitement de la page JSP lors de la fourniture des rôles avec des guillemets simples à la méthode, notamment lorsque la page est associée à JQuery:

  ...  

Bien que ce soit une solution obsolète en faveur de la méthode d’access, je pense que la solution proposée ici est également utile. Utiliser la méthode ifAllGranted au lieu de la méthode d’access:

  ...  

Notez également que vous devez inclure la balise suivante sur votre page JSP:

 <%@taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>