2011-08-25 60 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刪除。

希望有幫助!