如何使用<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" %>