【问题标题】:Configuring Share Roles in Existing Installation在现有安装中配置共享角色
【发布时间】:2016-07-21 04:49:43
【问题描述】:

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

等等。

我在配置我的新角色时没有问题,它在全新安装或新站点中就像一个魅力,我遇到的问题是我需要让角色可用于现有站点。

为此,我在代表站点的系统组中创建了一个子组。例如说GROUP_site_{siteId} 是站点,我创建了一个名为GROUP_site_{siteId}_MyCustomRole 的子组。问题是子组是在APP.DEFAULT 区域中创建的,为了使其正常工作,它必须在APP.SHARE 区域中(如果我错了,请任何人纠正我)。

基本上这就是我遇到的问题...我需要“升级”现有网站,但我不确定如何在 APP.SHARE 区域中创建子组。

我已阅读 JavaScript API 和 REST 服务文档,似乎不支持区域管理。我认为可以实现的唯一方法是通过 Java API,特别是使用授权服务:http://dev.alfresco.com/resource/docs/java/repository/org/alfresco/service/cmr/security/AuthorityService.html

现在,假设 Java 授权服务是我唯一的选择,哪一种方法是实现在适当区域创建子授权的升级功能的正确方法?也许通过创建自定义补丁 (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

【问题讨论】:

    标签: alfresco roles alfresco-share


    【解决方案1】:

    这很丑,但你可以从 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);
    

    【讨论】:

    • 看起来很有希望,我认为值得一试。虽然我不明白你所说的“在你这样做之前,请真正意识到你可能不得不处理的所有后果”是什么意思,你能详细说明一下吗?
    • 您建议的 JavaScript 代码有效,尽管我已经意识到处理区域仍然不能解决问题,实际上它是可选的。为现有站点配置新角色的关键是在站点容器文件夹上配置适当的权限。我会在一分钟内详细说明我的问题的完整解决方案。
    • 至于后果,假设你在争取组(不是权限!)对称,你可能需要处理组生命周期、邀请过程、离开站点、权限对话框和其他 UI控制。您可以通过将用户放在不同的组中来轻松搞砸,甚至可能聚合这些组,然后想知道这个用户的角色到底是什么。 “站点成员”页面建议每个用户都有一个角色。这可能并不完全正确。
    • 您的观点非常好。幸运的是,我们根本没有使用邀请流程,离开网站也不是问题。但是,我担心工作流程,我只是想知道这是否会受到影响......
    【解决方案2】:

    我想出的在以前存在的站点中配置和启用新角色的解决方案如下。

    1. 配置新角色,例如正如这里解释的那样:https://wiki.alfresco.com/wiki/Custom_Permissions_in_Share
    2. 在所需站点组下创建新的子组权限。您可以使用 REST API 或 JavaScript API 从管理控制台中的“组”实用程序执行此操作。
    3. 将新的子组权限添加到APP.SHARE 并将其从APP.DEFAULT 中删除。
    4. 在站点的根文件夹上配置适当的权限。换言之,必须将新角色授予新的子组。

    注意:我尚未确认,但第三步可能是可选的。我认为这样做的唯一好处是让新的子组以与 Alfresco 内部完全相同的方式正确安排。

    我创建了以下 JavaScript sn-p,可以使用 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 所指出的,您可能还需要处理群组生命周期、邀请流程、工作流程等问题,因此请谨慎使用此解决方案! p>

    编辑:

    这里解释的解决方案可能也有效,但我没有尝试过:http://blog.abstractive.ca/2012/12/custom-share-role-breaks-existing-sites-solution/

    【讨论】:

      【解决方案3】:

      对于遇到以下错误的人:org.springframework.beans.factory.BeanDefinitionStoreException:只能在引用原型 bean 定义时为 getBean 方法指定参数 .

      请使用以下获取 authorityService bean。 var authorityService = ctx.getBean("authorityService",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;
      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 2017-11-06
        • 1970-01-01
        相关资源
        最近更新 更多