我想基于使用Spring Security JSP标记库的角色有条件地显示一些内容。 但是在Spring Security 3.1.x中只检查一个角色。
我可以使用但 ifAllGranted 已被弃用。
任何帮助?
答案 0 :(得分:73)
spring security中有一个特殊的安全表达式:
hasAnyRole(角色列表) - 如果用户被授予任何权限,则为true 指定的角色(以逗号分隔的字符串列表给出)。
我从未使用过它,但我认为这正是你所寻找的。 p>
使用示例:
<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中...