用于层次结构树角色的 Spring Security/Java EE 解决方案

我知道Spring Security适用于标准角色和基于权限的授权。我不确定的是这个场景:

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

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

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


答案 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不能做任何超出其权限的事情。

顺便说一句,它尚未完全测试,您可能会找到另一种可能的解决方案。

另请参阅:


答案 2

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

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


推荐