在 Spring Security ACL 中授予权限

Posted

技术标签:

【中文标题】在 Spring Security ACL 中授予权限【英文标题】:Granting permissions in Spring Security ACL 【发布时间】:2011-09-02 07:49:06 【问题描述】:

我在 grails 1.3.7 中使用 Spring Security ACL 插件,但我的问题可能比这更笼统:我想允许拥有 BasePermission.READ 访问对象的用户能够授予相同的权限给其他用户。如果 user1 对文档具有读取权限,他应该能够与 user2 共享该权限,从而授予他对同一文档的读取权限。

当第一次创建文档时,user1 被授予读取权限,所以我在日志中看到:

DEBUG   grails.app.service.org.grails.plugins.springsecurity.service.acl.AclUtilService     Added permission BasePermission[...............................R=1] for Sid PrincipalSid[User user1] for com.fxpal.ara.Document with id 1

然后我尝试向 user2 授予 READ 权限,同时作为 user1 进行身份验证,我得到了这个异常:

org.springframework.security.acls.model.NotFoundException: Unable to locate a matching ACE for passed permissions and SIDs

所以我的问题是: 1. 是否需要BasePermission.ADMINISTRATION 才能允许用户向其他用户授予权限? 2. 是否有其他方法可以在只有部分权限的情况下授予权限?该政策在哪里实施,可以替代吗?

更新:

好吧,我想我可以添加一个AclAuthorizationStrategy 的新实现,它定义了public void securityCheck(Acl acl, int changeType) 方法,但是这个方法没有将请求的权限作为参数,从而挫败了我检查兼容权限的策略。接下来要做的是重新实现 AclImpl 以使用不同的逻辑。重复大部分相同的代码似乎是一种耻辱......

【问题讨论】:

您找到解决方案了吗? 不,不是。我曾尝试使用AclAuthorizationStrategyImpl,但这并没有成功。我将重新审视代码(已经有一段时间了!),看看是否有任何我可以从中提取的合理信息来回答这个问题。 【参考方案1】:

您可以通过创建

<bean id="aclAuthorizationStrategy" class="org.springframework.security.acls.domain.AclAuthorizationStrategyImpl">
     <constructor-arg>
         <bean class="org.springframework.security.core.authority.SimpleGrantedAuthority">
              <constructor-arg>
                   <value>ROLE_ADMINISTRATOR</value>
              </constructor-arg>
         </bean>
     </constructor-arg>
</bean>

这里的ROLE_ADMINISTRATOR 应该是登录用户对象作为权限的一部分所具有的角色。基本上任何拥有此角色的人都可以管理权限。

【讨论】:

以上是关于在 Spring Security ACL 中授予权限的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security ACL 授予对现有对象身份的权限

非所有者时 Spring Security 更新 acl

spring-security:多少定制是明智的?

Sonata Admin Bundle ACL 不授予编辑权限

使用 Spring Security ACL

Spring Security - ACL readAclsById 不按 SID 过滤