我想将为用户提供的权限扩展到实体。
我可以通过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权限?
答案 0 :(得分:2)
我认为您已经有了答案,如果您创建了MutableAcl
,则可以简单地调用updateAcl
的{{1}}方法。如果正确实现了此方法的合同(如果您使用的是自定义实现),则应该:
MutableAclService
MutableAcl
创建所有新ACE
updateAcl
唯一的缺点是它假设ACL的“擦除和加载”策略,并不意味着逐步将ACE和其他内容添加到现有ACL中。这意味着您可能应该先修改完整的ACL,然后再修改它,这样您就不会无意中吹走已经在主体上的任何ACE。
希望有所帮助!
答案 1 :(得分:1)
我已经查看了代码,并且认为只有一个相关的ACL接口实现:AclImpl
。
此类实现MutableAcl
接口,由AclService
函数返回。
所以我决定将结果从Acl
投射到MutableAcl
。到目前为止,它正在工作,我没有遇到问题或类强制转换异常:
MutableAcl existingAcl = (MutableAcl) mutableAclService.readAclById(oid, sids);
...
mutableAclService.updateAcl(existingAcl);