如何实现ACL spring安全性以在用户组之间共享对象,而无需在ACL_Entry表中创建多个条目

时间:2016-02-18 08:09:00

标签: spring-security spring-security-acl

类似于下面提到的问题 How to implement ACL at a group level? E.g. only teachers in school A can update school A's calendar

我正在尝试使用acl spring security

解决以下问题

我们有一个方案可以将学生的成绩分享给一组教师。在这种情况下,当教师登录时,只有教师对Result对象有读取权限才能看到结果。如果我们需要将结果分享给教师组如果组中有10个成员具有读取权限,我们需要在ACL_Entry表中提供10个entires。这会很复杂,因为条目会随着组成员的增加和权限的增加而增加。是否还有其他任何方式,如果我将结果共享给group只有一个acl条目,其中group对结果对象具有读取权限,教师应该自动获得读取对象的权限。您还可以通过示例解释该模式的方式。

请帮忙

2 个答案:

答案 0 :(得分:0)

可能重复: spring-security-authorization-for-custom-usergroups

如果你看这个问题,你会发现这个可能的解决方案:

  

我正在使用具有ACL机制的用户组。基本上我确保为对象创建ACL时设置所有者。然后,当另一个用户尝试访问此对象时,将检查所有者的组以查看是否存在匹配。

     

这当然意味着当用户更改他的群组时,该对象就会随他而去。

     

如果您不想要这种行为,您可以将组对象的ACL作为安全对象的父acl。然后,当用户更改组时,您应该为组对象ACL设置正确的条目。这样,安全对象与用户组无关,而与用户本身无关。

     

Spring Security Domain Object Security (ACLs)

实际上,这些与您链接的问题中描述的内容有两种不同。

在我关联的问题的评论中也有一个简短的对话,所以如果你感兴趣,请务必阅读。

答案 1 :(得分:0)

为了解决上面使用的问题,我采用了以下方法。 我的架构中有user和user_role表。我在安全上下文中使用db作为authenticion manager。

                                             

SchoolA已经是我的应用程序的用户。 每当教师被添加到schoolA Group时。我将schoolA作为角色添加到教师以及用户角色。同时将结果对象分享给具有读取权限的schoolA组。我将schoolA视为GrantedAuthoritySid而不是PrincpalSid。因此,对于ACL_SID表中​​的SchoolA sid,主列将为false。无论何时教师在获取结果时登录,我们都会检查教师是否具有读取结果对象的权限。但是,教师具有schoolA角色且schoolA角色具有读取权限。当老师登录时,我能够获得结果对象。这样我解决了上述问题。