在现有安装中配置共享角色

时间:2014-01-31 11:29:54

标签: alfresco roles alfresco-share

我正在尝试为现有安装中的共享网站创建新角色(权限组)。在询问之前我做了“家庭作业”并找到了有用的资源,例如:

其中。

我在配置新角色方面没有问题,它在干净安装或新网站中就像一个魅力,我遇到的问题是我需要为现有网站提供该角色。

为此,我在系统组中创建了一个代表该站点的子组。例如,说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)?

除非我采取错误的做法,否则我想听听有同样问题的人的意见,否则我会非常感激一些建议。如果我是唯一需要为现有网站创建新角色的人,我会感到非常惊讶......

编辑:

此处跟踪此问题:https://issues.alfresco.com/jira/browse/MNT-2456

3 个答案:

答案 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)

我想出的解决方案是在以前的现有网站中配置和启用新角色,如下所示。

  1. 配置新角色,例如正如这里所解释的那样:https://wiki.alfresco.com/wiki/Custom_Permissions_in_Share
  2. 在所需的站点组下创建新的子组权限。您可以使用REST API或JavaScript API从管理控制台中的“组”实用程序执行此操作。
  3. 将新的子组权限添加到APP.SHARE并将其从APP.DEFAULT中删除。
  4. 在站点的根文件夹上配置适当的权限。换句话说,必须将新角色授予新的子组。
  5. 注意:我还没有确认,但第三步可能是可选的。我认为这样做的唯一好处就是让新的子组正确安排与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);

此外,我创建了以下脚本,该脚本将修复所有现有网站的自定义角色。您无需单独修复每个站点。

&#13;
&#13;
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;
&#13;
&#13;