如何更改Spring Security ACL中的权限?

时间:2011-08-25 18:07:10

标签: java spring-security acl

我想将为用户提供的权限扩展到实体。

我可以通过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:Object identity'org.springframework.security.acls.domain.ObjectIdentityImpl [Type:test.Entity;标识符:3]'已存在

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

2 个答案:

答案 0 :(得分:2)

我认为您已经有了答案,如果您创建了MutableAcl,则可以简单地调用updateAcl的{​​{1}}方法。如果正确实现了此方法的合同(如果您使用的是自定义实现),则应该:

  • 从该实体的当前ACL中删除所有ACE
  • 根据您传入MutableAclService
  • MutableAcl创建所有新ACE
  • 更新updateAcl
  • 上的所有相关字段
  • 更新ACL缓存

唯一的缺点是它假设ACL的“擦除和加载”策略,并不意味着逐步将ACE和其他内容添加到现有ACL中。这意味着您可能应该先修改完整的ACL,然后再修改它,这样您就不会无意中吹走已经在主体上的任何ACE。

希望有所帮助!

答案 1 :(得分:1)

我已经查看了代码,并且认为只有一个相关的ACL接口实现:AclImpl

此类实现MutableAcl接口,由AclService函数返回。

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

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