【问题标题】:Spring Security ACL customize default access to subjectSpring Security ACL 自定义对主题的默认访问
【发布时间】:2017-01-20 21:46:56
【问题描述】:

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

例如,我们有

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

user1 belongs to branch1
user2 belongs to branch2

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我先推荐一个:

    我的应用程序需要自定义对某个主题的访问权限 非常稀有。所以我不想为默认依赖项填充 ACL,但是 如果 ACL 为空,需要特殊说明。

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

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

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

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

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

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

    【讨论】:

    • 我知道,ACL 能够满足我的第一个需求。有用! 但是!我必须以这种方式处理许多主题(> 200 000)。我的应用程序对性能问题非常敏感。如果我可以使用角色提供默认限制并使用 ACL 管理其他权限和限制,那么性能会更好。
    • @Sergii 您意识到您可以将 AclEntry 添加到角色,对吧?例如,上面的根对象可以授予 ROLE_USER READ 访问权限。抱歉,如果您确实理解这一点,您的问题和评论中并不清楚。
    • 我喜欢将 aclEntry 添加到角色的想法。我需要时间考虑一下。 ...实施中有很多不清楚的部分...我会在几天后回答。
    • 对不起,我无法实现这个想法。如果您有 git 中的示例或可以实现您的想法,请分享您的解决方案以获取您的建议。
    • 嗨,也许我不清楚。一个 Ace 有一个 SID(一个接口),它标识了被授予权限的实体(或者如果 isGranted 返回 false 则被拒绝)。 Spring Sec 提供了两种 SID impls,其中之一是docs.spring.io/autorepo/docs/spring-security/3.2.6.RELEASE/… 这可以指向一个 GrantedAuthority(即一个角色),例如 ROLE_USER,从而授权所有人。
    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2018-05-16
    • 2019-07-18
    相关资源
    最近更新 更多