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

新手上路,请多包涵

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

我可以使用,但不推荐使用 ifAllGranted

有什么帮助吗?

原文由 K. Siva Prasad Reddy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 990
2 个回答

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

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

我从未使用过它,但我认为这正是您要找的东西。

用法示例:

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

这是描述标准 spring 安全表达式 的参考文档的链接。另外,这是一个 讨论,我在其中描述了如何在需要时创建自定义表达式。

原文由 dimas 发布,翻译遵循 CC BY-SA 3.0 许可协议

@dimas 的回答在逻辑上与你的问题不一致; 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>

Replacing ifAllGranted directly with hasAnyRole will cause spring to evaluate the statement using an OR instead of an AND .也就是说, hasAnyRole 将返回 true 如果经过身份验证的主体 至少包含一个 指定的角色,而 Spring 的(自 Spring Security 4 起已弃用) ifAllGranted 方法仅返回 true 如果经过身份验证的主体包含 所有 指定的角色。

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

原文由 acidnbass 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题