如何使用<sec:authorize access=“hasRole('ROLES)”>来检查多个角色?
2022-08-31 22:28:33
我想根据使用Spring Security JSP taglibs的角色有条件地显示一些内容。但是在Spring Security 3.1.x中,它只检查了一个角色。
我可以使用,但如果All Grant被弃用。
有什么帮助吗?
我想根据使用Spring Security JSP taglibs的角色有条件地显示一些内容。但是在Spring Security 3.1.x中,它只检查了一个角色。
我可以使用,但如果All Grant被弃用。
有什么帮助吗?
弹簧安全中有一个特殊的安全表达式:
hasAnyRole(角色列表) - 如果用户已被授予任何指定的角色(以逗号分隔的字符串列表给出),则为 true。
我从未使用过它,但我认为这正是您正在寻找的。
用法示例:
<security:authorize access="hasAnyRole('ADMIN', 'DEVELOPER')">
...
</security:authorize>
下面是一个指向参考文档的链接,其中描述了标准的弹簧安全表达式。另外,这里有一个讨论,我描述了如何在需要时创建自定义表达式。
@dimas的答案在逻辑上与你的问题不一致; 不能直接替换为 。ifAllGranted
hasAnyRole
老:
<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>
直接替换为 将导致 spring 使用 a 而不是 .也就是说,如果经过身份验证的主体包含至少一个指定角色,则将返回,而Spring的方法(自Spring Security 4起已弃用)仅在经过身份验证的主体包含所有指定角色时才返回。ifAllGranted
hasAnyRole
OR
AND
hasAnyRole
true
ifAllGranted
true
TL;DR:要复制使用Spring Security Taglib的新身份验证表达式语言的行为,需要使用该模式。ifAllGranted
hasRole('ROLE_1') and hasRole('ROLE_2')