【发布时间】:2013-12-11 01:57:36
【问题描述】:
简短的故事:我正在考虑将此操作授予所有消费者。安全方面,这有多愚蠢?
说来话长:
我想使用 OpenCmis API 在给定的 Alfresco 资源上获取用户允许的操作。
这样,我将决定我应该启用或渲染哪些 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:mapping 我可以看到:
<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。但我不确定这是否是解决这个问题的最佳方法,也许我正在打开一些安全漏洞。这会是一个好的解决方案吗?
或者也许我应该找到另一种方法来检查权限?有什么建议么?
感谢您的宝贵时间!
【问题讨论】:
标签: acl alfresco cmis opencmis