短篇小说:我正在考虑将此行动授予所有消费者。安全方面,这会是多么愚蠢?我应该向alfresco消费者授予base.ReadPermissions吗?
长的故事:
我想用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:all
和base.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
对公司的所有用户。但我不确定这是否是解决这个问题的最佳方式,也许我正在打开一些安全漏洞。这是一个很好的解决方案吗?
或者我应该找到另一种方法来检查权限?有什么建议么?
谢谢你的时间!
thanx,在这里很多好点。然而,我并没有使用你提出的webScripts API,而是Apache化学OpenCmis,我找不到另一种方法来获得允许的动作 – yannicuLar
Oke,但是在Apache化学OpenCMIS中,你可以定义是否需要原子绑定, json或WebService绑定。所以我想你需要在CMIS中多挖一点。 –