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

时间:2012-07-13 11:03:16

标签: java spring spring-mvc spring-security

我想基于使用Spring Security JSP标记库的角色有条件地显示一些内容。 但是在Spring Security 3.1.x中只检查一个角色。

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

任何帮助?

5 个答案:

答案 0 :(得分:73)

spring security中有一个特殊的安全表达式:

  

hasAnyRole(角色列表) - 如果用户被授予任何权限,则为true   指定的角色(以逗号分隔的字符串列表给出)。

我从未使用过它,但我认为这正是你所寻找的。

使用示例:

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

这是一个link to the reference documentation,其中描述了标准的spring安全表达式。另外,这里是discussion,我在其中描述了如何在需要时创建自定义表达式。

答案 1 :(得分:5)

@ dimas的答案在逻辑上与你的问题不一致; ifAllGranted无法直接替换hasAnyRole

来自Spring Security 3—>4 migration guide

旧:

<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>

直接用ifAllGranted替换hasAnyRole会导致spring使用OR而不是AND来评估语句。也就是说,如果经过身份验证的主体包含指定角色的至少一个,则hasAnyRole将返回true,而Spring(现在已从Spring Security 4中弃用)如果经过身份验证的主体包含指定角色的所有,则ifAllGranted方法仅返回true

TL; DR :要使用Spring Security Taglib的新身份验证表达式语言复制ifAllGranted的行为,需要使用hasRole('ROLE_1') and hasRole('ROLE_2')模式。< / p>

答案 2 :(得分:1)

我使用了hasAnyRole('ROLE_ADMIN','ROLE_USER')但是我的bean创建低于错误

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')"它对我来说很好。

因为我的一个用户是管理员和用户。

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

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

答案 3 :(得分:0)

如果您使用百里香叶,您可以尝试这种方式

sec:authorize="hasAnyRole(T(com.orsbv.hcs.model.SystemRole).ADMIN.getName(),
               T(com.orsbv.hcs.model.SystemRole).SUPER_USER.getName(),'ROLE_MANAGEMENT')"

如果用户具有上述角色,则返回true,否则返回false。

请注意,您必须像这样在html声明标签中使用sec标签

<html xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

答案 4 :(得分:0)

在Spring Boot 2.4中是

pynput.keyboard._xorg

确保您拥有

thymeleaf-extras-springsecurity5

在您的依赖项中。还要确保包含名称空间

sec:authorize="hasAnyRole('ROLE_ADMIN')

在您的html中...