spring-security 如何用于< sec:authorize access="hasRole('ROLES)">检查多个角色?

kqqjbcuj  于 2022-11-11  发布在  Spring
关注(0)|答案(5)|浏览(283)

我想使用Spring Security JSP标记库根据角色有条件地显示一些内容,但是在Spring Security 3.1.x中只检查一个角色。
我可以使用,但不建议使用ifAllGranted
有什么帮助吗?

hsgswve4

hsgswve41#

Spring 安全有一个特殊的安全表达:

  • hasAnyRole(list of roles)* -如果用户已被授予任何指定的角色(以逗号分隔的字符串列表形式给出),则为true。

我从来没有用过它,但我认为它正是你要找的。
示例用法:

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

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

h79rfbju

h79rfbju2#

迪马斯的回答与你的问题在逻辑上并不一致; ifAllGranted不能直接替换为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直接替换ifAllGranted将导致spring使用OR而不是AND来计算语句。也就是说,如果经过身份验证的主体包含 * 至少一个 * 指定角色,hasAnyRole将返回true。而Spring的ifAllGranted方法(在Spring Security 4中已弃用)仅在经过身份验证的主体包含 * 所有 * 指定角色的情况下才返回true

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

ippsafx7

ippsafx73#

我使用了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')",我觉得它运行得很好。
因为我其中一个用户既是admin又是user。
为此,您需要添加use-expressions="true" auto-config="true",后跟http标记

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

p5cysglq4#

在Sping Boot 2.4中,

sec:authorize="hasAnyRole('ROLE_ADMIN')

请确保您已
百里香叶-附加- spring security 5
的名称空间。同时请确定您包含

xmlns:sec="http://www.thymeleaf.org/extras/spring-security"

在您的html中...

pu82cl6c

pu82cl6c5#

如果你用的是thymeleaf,你可以这样试

sec:authorize="hasAnyRole('ROLE_ADMIN','ROLE_USER')"

如果经过身份验证的主体至少包含一个指定角色,则hasAnyRole将返回true,否则返回false。

请注意,您必须在html声明标记中使用sec标记,如下所示

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

相关问题