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

Java 如何更改Spring Security ACL中的权限?,java,spring-security,acl,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.upd

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

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


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

我认为您已经找到了答案,如果您创建了
MutableAcl
,您只需调用
MutableAclService
updateAcl
方法即可。如果正确实现了此方法的约定(如果您使用的是自定义实现),则应:

  • 从该实体的当前ACL中删除所有ACE
  • 根据传递到
    updateAcl
  • 更新
    ObjectIdentity
  • 更新ACL缓存
唯一的缺点是,它假定ACL采用“擦除和加载”策略,而不是向现有ACL增量添加ACE和其他内容。这意味着在修改ACL之前,您可能应该首先阅读整个ACL,这样您就不会无意中破坏主体上已有的任何ACE


希望有帮助

我认为您已经得到了答案,如果您已经创建了
MutableAcl
,您可以简单地调用
MutableAcl服务的
updateAcl
方法。如果正确实现了此方法的约定(如果您使用的是自定义实现),则应:

  • 从该实体的当前ACL中删除所有ACE
  • 根据传递到
    updateAcl
  • 更新
    ObjectIdentity
  • 更新ACL缓存
唯一的缺点是,它假定ACL采用“擦除和加载”策略,而不是向现有ACL增量添加ACE和其他内容。这意味着在修改ACL之前,您可能应该首先阅读整个ACL,这样您就不会无意中破坏主体上已有的任何ACE


希望有帮助

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

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

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

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

我看了一下代码,发现ACL接口只有一个相关的实现:
AclImpl

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

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

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