2013-12-09 14 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中多挖一点。 –

相关问题