【问题标题】:How to change the Permisions in Spring Security ACL?如何更改 Spring Security ACL 中的权限?
【发布时间】:2011-08-29 19:51:11
【问题描述】:

我想将授予用户的权限扩展到实体。

我可以通过MutableAclService 创建 ACL。

MutableAcl acl = this.mutableAclService.createAcl(new ObjectIdentityImpl(entity));            
acl.setOwner(SYSTEM_PRINCIPAL_SID);
acl.insertAce(0, permission, grantToSid, true);
this.mutableAclService.updateAcl(acl);

但我不知道如何更改 ACL。例如,如果用户对实体具有读取权限,我想为他提供额外的写入权限。 或者授予其他用户相同的权限。


我的第一次尝试是调用MutableAclService.createAcl 两次,但失败了:

org.springframework.security.acls.model.AlreadyExistsException:对象身份'org.springframework.security.acls.domain.ObjectIdentityImpl [类型:test.Entity;标识符:3]' 已经存在

好的,接缝是正确的,错误的方式。但是那怎么办呢? 如何更改已经定义了一些权限的实体的 acl 权限?

【问题讨论】:

    标签: java spring-security acl


    【解决方案1】:

    我想你已经有了答案,如果你已经创建了MutableAcl,你可以简单地调用MutableAclServiceupdateAcl方法。如果此方法的约定正确实现(如果您使用的是自定义实现),它应该:

    • 从该实体的当前 ACL 中删除所有 ACE
    • 根据您传递给updateAclMutableAcl 创建所有新的ACE
    • 更新ObjectIdentity 上的所有相关字段
    • 更新 ACL 缓存

    唯一的缺点是它假定 ACL 采用“擦除和加载”策略,而不是增量将 ACE 和其他内容添加到现有 ACL。这意味着您可能应该先完整阅读 ACL,然后再对其进行修改,以免无意中删除主体上已经存在的任何 ACE。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      我查看了代码,它似乎只有一个 ACL 接口的相关实现:AclImpl

      该类实现MutableAcl 接口并由AclService 函数返回。

      所以我决定将结果从Acl 转换为MutableAcl。到目前为止它正在工作,我没有遇到问题或 Class cast 异常:

      MutableAcl existingAcl = (MutableAcl) mutableAclService.readAclById(oid, sids);
      ...
      mutableAclService.updateAcl(existingAcl);
      

      【讨论】:

        猜你喜欢
        • 2011-11-20
        • 2013-04-17
        • 2014-05-11
        • 2011-09-02
        • 2014-02-18
        • 2013-11-07
        • 2013-09-30
        • 2014-11-16
        相关资源
        最近更新 更多