层次树角色的 Spring Security / Java EE 解决方案

Posted

技术标签:

【中文标题】层次树角色的 Spring Security / Java EE 解决方案【英文标题】:Spring Security / Java EE solutions for hierarchy tree roles 【发布时间】:2012-07-09 10:29:05 【问题描述】:

我知道 Spring Security 适合标准角色和基于权限的授权。我不确定是这种情况:

系统中管理着 10,000 名员工,员工被组织成一个组织结构图(跨部门谁向谁报告的树)。其中一些员工是用户。这些用户只能访问其职责范围内的员工(他们在树中的分支/员工的后代)。

所以我想知道现代 Java EE(或其他)系统如何管理这些检查? Spring Security (ACL) 可以做到这一点吗?如何建模?

我们的旧实现(多年前)是当用户访问员工时,我们可以通过递归树来检查请求的员工是否是后代。但这不是理想的解决方案,我们想使用新的解决方案。

【问题讨论】:

可以给用户添加角色,Spring security可以基于角色工作吗?? 是的,我们可以,但问题是我们如何将角色组织为层次结构树? 事实上,这正是我正在做的事情! 不确定 Spring Security 是否可以做很多事情。但是你可以查看apache的Shiro,更多信息@shiro.apache.org。干杯 【参考方案1】:

由于我已经研究这个主题一个月了,我可以给你我对这个问题的答案,但是可能会有更好的答案。 Spring Security 中存在角色层次结构,如果您使用 ROLE_A > ROLE_B,那么 ROLE_A 将拥有 ROLE_B 拥有的所有授权。 所以这里有两个选择:1。对于每个用户及其后代都有一对角色,例如 . ROLE_USERi 用于用户,ROLE_USERiDESC 用于其后代。您将拥有ROLE_USERi > ROLE_USERiDESC 但是(因为我不知道你的组织结构图)这可能是不够的,因为可能有很多这样的对!不知何故,如果您的树有两个或三个级别(ROLE_USER 最多有一个或两个祖先),这是合适的,因为角色越高,它拥有的权限就越多。 2. 在我的项目中(意外地非常相似)我做了另一个选择。我有一些基本动作的基本角色。而且我有一个“照顾小组”,照顾者可以在其中观察其后代的数据。我为什么要这样做?因为我必须为某些操作(如编辑、删除、访问到一些敏感数据和...) 和有爱心的团体进行观察。 如果 A 是 B 的照顾者,它可以观察 B 的数据,但 A 不能做任何超出其权限的事情。 顺便说一句,它尚未完全测试,您可能会找到另一种可能的解决方案。

另见:

Spring Security 3.1.x Documentation

【讨论】:

您好,Matin,感谢您的回答。角色层次结构非常适合这种情况。只是想知道如果有很多级别的树,性能如何?此外,该项目是一个 SaaS,层次结构必须可针对每个客户端进行配置。 由于角色可以动态管理,因此在您的项目中使用 Spring Security 不会有任何问题。如果您的树有许多级别,则分配角色可能是一项耗时的任务。但是一旦你做到了,你就不用担心性能了。 (只是想知道,你是奥地利人吗?;-)) 澳大利亚,你呢?很高兴认识你【参考方案2】:

当我们谈论 Spring Security 时,Spring 提供了两件事。 1) 角色管理 2)ACL(域级权限) 我认为您需要的是域级别的权限。

如果您计划使用角色管理,通过为每个用户创建相应的角色,数据可能会增长。 第二个选项是使用域级别权限(spring ACL),这是一个很好的运行时授权框架。您可以将其用于基于注释的授权,但管理 API 非常有限(BasicLookupStrategy),因此请在使用之前阅读文档。

【讨论】:

以上是关于层次树角色的 Spring Security / Java EE 解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Spring security @secure 不适用于角色层次结构

Spring Webflux Security 中的角色层次结构

Spring Security应用开发(15)层次化角色体系

如何在 Spring Security 3 和 Spring EL 中使用角色层次结构?

Spring Security 3.2 - 配置全局方法安全性以使用角色层次结构

Spring Security 3.1.4 taglib 授权/身份验证不适用于 Tomcat 7 上 JSF 2.2 中的角色层次结构