我正在尝试为现有安装中的共享网站创建新角色(权限组)。在询问之前我做了“家庭作业”并找到了有用的资源,例如:
其中。
我在配置新角色方面没有问题,它在干净安装或新网站中就像一个魅力,我遇到的问题是我需要为现有网站提供该角色。
为此,我在系统组中创建了一个代表该站点的子组。例如,说GROUP_site_{siteId}
是网站,我创建了一个名为GROUP_site_{siteId}_MyCustomRole
的子组。问题是子组是在APP.DEFAULT
区域中创建的并且为了使其正常工作,它必须位于APP.SHARE
区域(如果我错了,请任何人纠正我)。
基本上这就是我遇到的问题......我需要'升级'现有网站,但我不确定如何在APP.SHARE
区域创建子组。
我已阅读JavaScript API和REST服务文档,似乎不支持区域管理。我能看到它的唯一方法是通过Java API,特别是使用Authority服务:http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/service/cmr/security/AuthorityService.html
现在,假设Java Authority服务是我唯一的选择,这是实现在适当区域中创建子权限的升级功能的正确方法吗?也许是通过创建自定义补丁(http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/repo/admin/patch/impl/package-summary.html)?
除非我采取错误的做法,否则我想听听有同样问题的人的意见,否则我会非常感激一些建议。如果我是唯一需要为现有网站创建新角色的人,我会感到非常惊讶......
编辑:
答案 0 :(得分:2)
很难看,但你可以用JavaScript创建这种类型的组。在此之前,要真正了解您可能需要处理的所有后果。在露天分享中加入基于团队的安全性很简单 - 即使你只坚持使用ootb功能。它是德语版,但您可能仍然不想看看我在http://www.contentreich.de/contentreich-alfresco-add-on-site-gruppen提出的扩展名。
也就是说,您可以使用Javascript创建组:
var groupName = "YourGroup";
var shareZones = Packages.java.lang.Class.forName("java.util.HashSet").newInstance();
shareZones.add(Packages.org.alfresco.service.cmr.security.AuthorityService.ZONE_APP_SHARE);
shareZones.add(Packages.org.alfresco.service.cmr.security.AuthorityService.ZONE_AUTH_ALFRESCO;
var ctx = Packages.org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();
var authorityService = ctx.getBean("authorityService");
var siteRoleGroup = "site_" + site.shortName + "_Site" + groupName;
var permissionGroup = authorityService.createAuthority(Packages.org.alfresco.service.cmr.security.AuthorityType.GROUP, siteRoleGroup, site.shortName, shareZones);
答案 1 :(得分:0)
我想出的解决方案是在以前的现有网站中配置和启用新角色,如下所示。
APP.SHARE
并将其从APP.DEFAULT
中删除。注意:我还没有确认,但第三步可能是可选的。我认为这样做的唯一好处就是让新的子组正确安排与Alfresco内部完全相同的方式。
我创建了以下JavaScript代码段,可以使用JavaScript控制台管理工具(https://addons.alfresco.com/addons/javascript-console)轻松运行和修改。如果您需要在多个现有站点中启用新角色,这可能很有用。
var siteName = "my-site-id";
var newRoleName = "CustomConsumer";
var newRoleSubGroupName = "site_" + siteName + "_" + newRoleName;
var newRoleSubGroupFullName = "GROUP_" + newRoleSubGroupName;
/************************************************************/
/** Creation of the sub-group that represents the new role **/
/************************************************************/
logger.log("Starting sub-group creation");
// Get the site group object
var siteGroup = groups.getGroup("site_" + siteName);
// Create the sub-group
var newRoleSubGroup = siteGroup.createGroup(newRoleSubGroupName, newRoleSubGroupName);
logger.log("Sub-group creation done");
/**************************************************/
/** Setup the appropriate zones to the sub-group **/
/**************************************************/
logger.log("Setting up appropriate zones to the sub-group");
var shareZonesAdd = Packages.java.lang.Class.forName("java.util.HashSet").newInstance();
shareZonesAdd.add(Packages.org.alfresco.service.cmr.security.AuthorityService.ZONE_APP_SHARE);
var shareZonesRemove = Packages.java.lang.Class.forName("java.util.HashSet").newInstance();
shareZonesRemove.add(Packages.org.alfresco.service.cmr.security.AuthorityService.ZONE_APP_DEFAULT);
var ctx = Packages.org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();
var authorityService = ctx.getBean("authorityService");
var permissionGroup = authorityService.addAuthorityToZones(newRoleSubGroupFullName, shareZonesAdd);
var permissionGroup = authorityService.removeAuthorityFromZones(newRoleSubGroupFullName, shareZonesRemove);
logger.log("Zones setup done");
/*******************************************************/
/** Setup the appropriate permissions fo the new role **/
/*******************************************************/
var nodes = search.xpathSearch('/app:company_home/st:sites/cm:' + siteName);
for (var i = 0; i < nodes.length; i++)
{
logger.log("Setting new 'Content Expert' role permissions...");
nodes[i].setPermission(newRoleName, newRoleSubGroupFullName);
logger.log("Permissions folder successfully set");
}
重要提示:请记住,正如Andreas Steffan指出的那样,您可能还需要处理群组生命周期,邀请流程,工作流程等等。所以请注意使用此解决方案!
编辑:
此处解释的解决方案也可能有效,但我没有尝试过:http://blog.abstractive.ca/2012/12/custom-share-role-breaks-existing-sites-solution/
答案 2 :(得分:0)
对于收到错误的人: org.springframework.beans.factory.BeanDefinitionStoreException:在引用原型bean定义时只能指定getBean方法的参数 。
请使用以下内容获取authorityService bean。 var authorityService = ctx.getBean(&#34; authorityService&#34;,Packages.org.alfresco.service.cmr.security.AuthorityService);
此外,我创建了以下脚本,该脚本将修复所有现有网站的自定义角色。您无需单独修复每个站点。
main();
function main(){
var message = 'Test';
var successCount = 0;
var failedCount = 0;
var successNodes = [];
var failNodes = [];
var allSites = siteService.listSites(null, null, 0);
for (var siteIndex = 0; siteIndex < allSites.length; siteIndex++) {
var siteShortName = allSites[siteIndex].shortName;
logger.log("SiteShortName: "+siteShortName);
var siteNode = allSites[siteIndex].getNode();
var response = createAuthorities(siteShortName, [ "SiteViewer" ], siteNode);
if (response == 'success') {
successCount = successCount + 1;
successNodes[siteNode.nodeRef] = 'Success - '+ siteNode.properties.name + ' and SiteShortName - ' + siteShortName;
} else {
failedCount = failedCount + 1;
failNodes[siteNode.nodeRef] = 'Failed - '+ siteNode.properties.name +' and SiteShortName - ' + siteShortName;
}
}
model.message = 'Success count = '+successCount+' Fail count = '+failedCount+' Total = '+allSites.length;
model.successNodes = successNodes;
model.failNodes = failNodes;
logger.log(successNodes);
logger.log(model.message);
}
function createAuthorities(siteName, rolesList, siteNode) {
var msg = "";
try {
var siteExp = "site_" + siteName;
var prefix = siteExp + "_";
var rootGroup = groups.getGroup(siteExp);
for (var roleIndex = 0; roleIndex < rolesList.length; roleIndex++) {
var roleName = rolesList[roleIndex];
var groupName = prefix + roleName;
var groupFullName = "GROUP_"+ groupName;
logger.log("GroupName: "+groupName+" and roleName: "+roleName);
if (groups.getGroup(groupName) == null) {
rootGroup.createGroup(groupName, groupName);
}
if (siteNode != null) {
siteNode.setPermission(roleName, groupFullName);
}
logger.log("Sub-group creation done");
/**************************************************/
/** Setup the appropriate zones to the sub-group **/
/**************************************************/
logger.log("Setting up appropriate zones to the sub-group");
var shareZonesAdd = Packages.java.lang.Class.forName("java.util.HashSet").newInstance();
shareZonesAdd.add(Packages.org.alfresco.service.cmr.security.AuthorityService.ZONE_APP_SHARE);
var shareZonesRemove = Packages.java.lang.Class.forName("java.util.HashSet").newInstance();
shareZonesRemove.add(Packages.org.alfresco.service.cmr.security.AuthorityService.ZONE_APP_DEFAULT);
var ctx = Packages.org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();
var authorityService = ctx.getBean("authorityService",Packages.org.alfresco.service.cmr.security.AuthorityService);
authorityService.addAuthorityToZones(groupFullName, shareZonesAdd);
authorityService.removeAuthorityFromZones(groupFullName, shareZonesRemove);
logger.log("Zones setup done");
}
msg = "success";
} catch (e) {
msg = e.message;
logger.log("Error while creating authority for "+ siteNode.nodeRef);
}
return msg;
}
&#13;