2011-08-25 80 views
0

我想将给用户的权限扩展到实体。如何更改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:对象身份“org.springframework.security.acls.domain .ObjectIdentityImpl [类型:test.Entity;标识符:3]'已存在

确定接缝是正确的,错误的方式。但如何做到这一点呢? 如何更改已定义一些权限的实体的acl权限?

回答

1

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

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

所以我决定把结果从Acl投到MutableAcl。到目前为止它正在工作,我没有遇到任何问题或者类别抛出异常:

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

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

  • 删除当前ACL所有的ACE为实体
  • 创建基于MutableAcl各位新的ACE传递到updateAcl
  • 更新的ObjectIdentity
  • 更新ACL高速缓存中的所有相关领域

这样做的唯一的缺点是它假定ACL的“擦除和加载”策略,它并不意味着递增添加ACE和其他东西到现有的ACL。这意味着在修改ACL之前,您应该首先阅读整个ACL,以便您不会无意中将已经在委托人身上的任何ACE删除。

希望有帮助!

相关问题