短篇小说:我正在考虑向所有消费者发放此行动。安全方面,那会有多愚蠢?
长篇故事:
我想使用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
,因此Consumer根本无法获取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
。但我不确定这是否是解决问题的最佳方法,也许我正在打开一些安全漏洞。这会是一个很好的解决方案吗?
或许我应该找另一种检查权限的方法?有什么建议?
感谢您的时间!
答案 0 :(得分:1)
我不确定这是不是你的意思,但为什么你需要一个对象的ACLS?
您想要启用/禁用操作,因此如果您可以获得允许操作,那就足够了。 为什么你甚至想看看用户/组x是否拥有对象的权限?
如果您查看Allowable Actions CMIS API的可能结果,那么您需要了解所有内容。同时在 operationContext 中设置include Actions为真)
如果您想了解对象的权限以及除启用/禁用操作之外的其他操作,请使用管理员帐户检查权限并与当前用户进行交叉检查。
其次:我认为启用权限不会造成伤害,但在长期升级等方面我不会更改默认权限。然后,我创建一个具有此权限的自定义权限组,并将其应用于顶级的EVERYONE组。