如何使用<sec:authorize access =“hasRole('ROLES)”>检查多个angular色?

我想使用Spring Security JSP taglibs基于angular色有条件地显示一些内容。 但在Spring Security 3.1.x中只检查一个angular色。

我可以使用,但ifAllGranted已被弃用。

任何帮助?

春季安全有一个特殊的安全expression:

hasAnyRole(angular色列表) – 如果用户已被授予指定的任何angular色(作为逗号分隔的string列表 ,则为true。

我从来没有使用过,但我认为这正是你正在寻找的。

用法示例:

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

这里是描述标准弹簧安全expression式的参考文档的链接 。 另外,这里是我介绍如何在需要时创build自定义expression式的讨论 。

@迪马斯的回答在逻辑上与你的问题不一致。 ifAllGranted不能直接replace为hasAnyRole

从Spring Security 3-> 4迁移指南 :

旧:

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

新(SPeL):

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

hasAnyRole直接replaceifAllGranted将导致spring使用OR来代替AND来评估语句。 也就是说,如果经过身份validation的主体至less包含一个指定的angular色,则hasAnyRole将返回true ,而Spring的(现在不推荐使用Spring Security 4) ifAllGranted方法只在经过身份validation的主体包含所有指定的angular色时才返回true

TL; DR :要使用Spring Security Taglib的新authenticationexpression式语言复制ifAllGranted的行为,需要使用hasRole('ROLE_1') and hasRole('ROLE_2')模式。

我用hasAnyRole('ROLE_ADMIN','ROLE_USER')但我正在创build低于错误的bean创build

 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/*] 

然后我试了

access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')" ,它工作正常。

作为我的用户之一是pipe理员以及用户。

为此,您需要添加use-expressions="true" auto-config="true"然后加上http标记

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

在JSP页面上使用hasAnyRole可能会导致处理JSP页面时出现exception,如下面的方法向单引号提供angular色时,大多数情况下是在页面与JQuery结合使用时:

 <security:authorize access="hasAnyRole('ROLE_USER')"> ... </security:authorize> 

虽然这是一个赞成访问方法的弃用解决scheme,但我认为这里提供的解决scheme也是有用的。 使用ifAllGranted方法而不是访问方法:

 <security:authorize ifAllGranted="ROLE_USER"> ... </security:authorize> 

另外,请注意在您的JSP页面中包含以下标记:

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