0

使用 spring ACL,我可以为主题上的某些操作配置权限。我的应用程序很少需要自定义主题的访问权限。所以我不想为默认依赖填充 ACL,但如果 ACL 为空则需要特殊指令。

例如,我们有

branch1
|-doc1
|-doc2
|-doc3
branch2
|-doc1
|-doc2
|-doc3

user1 belongs to branch1
user2 belongs to branch2

默认情况下, user1应该可以访问branch1中的所有文档(如果 ACL 为空)。用户 2 -> 分支 2。有时 user1 需要特殊访问权限。他需要访问branch2.doc3并且他应该对branch1.doc2有限制!

如果我尝试使用 ACL 建议以类似的方式实施解决方案,我需要为每个用户添加相应分支中每个文档的权限。由于规范化 && 许可,这种方式非常难看。所以我想实现解决方案,其中 ACL 逻辑仅用于交叉引用,默认权限允许任何用户访问同一分支中的每个文档......

默认情况下,我可以使用诸如@PostAuthorize@PreAuthorize 之类的方法注释以及诸如hasRolehasPermission之类的检查,但我无法建立权限限制强于角色的条件,或者基于关系用户分支对请求应用过滤器。

我知道这个想法应该可以实现,但是我没有找到相应的描述或技巧示例如何实现它......

4

1 回答 1

0

我先提个建议:

我的应用程序很少需要自定义主题的访问权限。所以我不想为默认依赖填充 ACL,但如果 ACL 为空则需要特殊指令。

不确定这是一个好主意(不是说你不能,只是提供谨慎)。这需要特殊的逻辑(这些人以这种方式获得授权,而那些人以这种方式获得授权),这会增加您的应用程序的复杂性。我将解释一些您可能不知道的有关 Spring Security ACL 的内容,然后提供一种替代方法。

您可以使用父 ACL 的概念来解决您所要求的问题。从文档

ACL_OBJECT_IDENTITY 存储系统中每个唯一域对象实例的信息。列包括 [...] 父级、ACL_SID 表的外键以表示域对象实例的所有者,以及我们是否允许 ACL 条目从任何父级 ACL 继承。对于要为其存储 ACL 权限的每个域对象实例,我们都有一行。

这样,branch2可以有一个acl,也branch2.doc3可以有一个继承自的acl branch2

使用它,您可以链接父对象,并拥有一个具有默认 ACL 的根对象。换句话说,所有分支都有一个具有默认 ACL 的根对象的父级。

使用这种方法的优点是随着复杂性的增加它更容易扩展。您仍然强制执行单一方式,并且可以使用任意复杂的逻辑来定义您的 acl。

于 2016-09-13T13:07:48.433 回答