Spring Security ACL自定义对主题

时间:2016-09-13 10:15:38

标签: java spring spring-security spring-security-acl

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

例如,我们有

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

user1 belongs to branch1
user2 belongs to branch2

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

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

默认情况下,我可以使用 @PostAuthorize @PreAuthorize 等方法注释,并使用 hasRole hasPermission 等检查,但是不能建立条件允许限制比角色强,或者根据关系用户分支申请过滤器。

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

1 个答案:

答案 0 :(得分:0)

我将首先提出建议:

  

我的应用程序需要自定义主题的访问权限   非常稀有。所以我不希望填充ACL用于默认依赖,但是   如果ACL为空,则需要特殊指令。

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

您可以使用父ACL的概念解决您要求的问题。来自docs

  

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

存储ACL权限

通过这种方式,branch2可以有一个acl,branch2.doc3可以有一个继承自branch2的acl。

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

使用此方法的优势在于,随着复杂性的增加,它可以更轻松地扩展。您仍然可以执行单一方法,并且可以使用任意复杂的逻辑来定义您的acls。