2013-12-09 15 views
0

我想用OpenCmis API來獲取用戶的允許的動作,在給定的露天資源。

這樣,我將決定我應該啓用或渲染哪些UI控件。我創建了一個函數,用於掃描用戶在該資源上允許的操作,並檢查給定的操作是否在其中,例如CAN_CHECK_OUT或CAN_GET_CONTENT_STREAM。

我的函數的工作就像:

private static Boolean canUserPerformAction_(Session cmisSession, String cmisObjId, String actionKey){ 

    try{ 
     OperationContext operationContext = new OperationContextImpl(); 
     operationContext.setIncludeAcls(true); 
     CmisObject obj = getResourceById(cmisSession, cmisObjId); 

     obj = (CmisObject)cmisSession.getObject(obj, operationContext); 

     Acl acl = obj.getAcl(); 
     AllowableActions actions = obj.getAllowableActions(); 
     Set<Action> allowedActions = actions.getAllowableActions(); 


     for(Action act :allowedActions){ 
      if(actionKey.equals(act.name())){ 
       return true; 
      } 
     } 
    }catch (Exception e){ 
     log.debug("Error accessing Object allowed actions | "+e.toString()); 
    } 
    return false; 
} 

但是這種方法對於消費者/讀取角色的用戶返回假陰性。我花了一些時間才意識到Action CAN_GET_ACL已被綁定角色cmis:allbase.ReadPermissions,所以消費者根本無法獲取ACL,因此我的方法將創建一個空的'allowedActions'數組。縱觀CMIS:映射我可以看到:

<cmis:mapping> 
      <cmis:key>canGetACL.Object</cmis:key> 
      <cmis:permission>cmis:all</cmis:permission> 
      <cmis:permission>{http://www.alfresco.org/model/system/1.0}base.ReadPermissions</cmis:permission> 
     </cmis:mapping> 

一個顯而易見的解決辦法是讓base.ReadPermissions對公司的所有用戶。但我不確定這是否是解決這個問題的最佳方式,也許我正在打開一些安全漏洞。這是一個很好的解決方案嗎?

或者我應該找到另一種方法來檢查權限?有什麼建議麼?

謝謝你的時間!

回答

1

我不確定這是你的意思,但你爲什麼需要一個對象的ACLS?

您想要啓用/禁用操作,所以如果您可以獲得允許操作,那就足夠了。 爲什麼你甚至想看看用戶/組x是否對某個對象有權限?

如果你看看Allowable Actions CMIS API的可能結果,那麼你需要知道的全部內容。另外在的OperationContextinclude Actions爲true)設置

如果你想知道一個對象的權限和做什麼其他的東西比啓用/禁用操作,然後使用管理員帳戶來檢查權限和交叉檢查它與當前用戶。第二:我認爲它不會損害啓用權限,但在長期的升級等方面,我不會更改默認權限。然後,我會創建一個具有此權限的自定義permissionGroup,並將其應用於頂層的EVERYONE組。

+0

thanx,在這裏很多好點。然而,我並沒有使用你提出的webScripts API,而是Apache化學OpenCmis,我找不到另一種方法來獲得允許的動作 – yannicuLar

+0

Oke,但是在Apache化學OpenCMIS中,你可以定義是否需要原子綁定, json或WebService綁定。所以我想你需要在CMIS中多挖一點。 –

相關問題