【问题标题】:Creating Roles Programmatically for each User Group以编程方式为每个用户组创建角色
【发布时间】:2014-12-06 21:23:32
【问题描述】:

我想在我的门户中为每个用户组创建一个角色,以便我可以一次向多个用户授予特定访问权限,具体取决于他们所属的组。

使用 Liferay API,有没有办法以编程方式为门户中存在的每个用户组添加角色?

这比通过 UI 单独添加每个角色更有效。

类似

for(i = 0; i < userGroups.size(); i++){
    roles.add(userGroups[i].getName());
}

如果可能,我想在同一方法中将相同的用户组分配给该角色,否则该角色将不知道关联的用户组:

roles.assignUserGroup(userGroups[i]);

有人完成过类似的任务吗?

链接 Liferay 论坛帖子http://liferay.com/community/forums/-/message_boards/message/46355079

【问题讨论】:

  • 您只能在 Liferay 中创建以下类型或角色: 1) 常规角色:权限在门户级别定义并在门户级别应用,2) 站点角色:权限在门户中定义级别并应用于一个特定站点, 3) 组织角色:权限在门户级别定义并应用于一个特定组织, 4) 团队:权限在特定站点内定义并在该特定站点内分配。它不支持用户组级别的角色。请描述您的要求,以便我可以建议另一种方法来实现它。
  • 您确实可以将角色分配给用户组。它将是您提到的 4 个角色之一,但属于一个组的用户仍然可以继承一个公共角色。我正在限制对某些页面的某些用户组的查看访问权限,将角色分配给用户组可以授予此功能,如果需要,还可以提供更多功能

标签: java liferay


【解决方案1】:

简而言之,您需要创建一个名称与您拥有的用户组名称相似的角色,然后将用户组分配给该角色。

您可以使用 Liferay 的 API 以编程方式执行此操作,因为 Liferay 也可以通过这种方式创建不同类型的角色并将用户、用户组等分配给角色。

您只需要深入研究源代码即可执行此操作。检查RoleLocalServiceImplUserGroupLocalServiceImplGroupLocalServiceImpl 的源代码。

我提供的是Liferay v6.2的步骤,6.0和6.1应该不会有太大变化:

  1. 使用UserGroupLocalServiceUtil.getUserGroups(companyId)获取所有用户组
  2. 像你做的那样循环遍历它:

    for (UserGroup userGroup : userGroups) {
       ... // steps to follow
    }
    
  3. 获取用户组的名称:userGroup.getName()

  4. 使用RoleLocalServiceUtil.addRole( ... ) 创建角色并使用GroupLocalServiceUtil.addRoleGroups( ... ) 将用户组分配给角色

    for (UserGroup userGroup : userGroups) {
        String userGroupName = userGroup.getName();
        // for locale specific title (optional, can be null)
        Map<Locale, String> titleMap = new HashMap<Locale, String>();
        titleMap.put(Locale.ENGLISH, userGroupName);
    
        // for locale specific description (optional, can be null)
        Map<Locale, String> descriptionMap = new HashMap<Locale, String>();
        titleMap.put(Locale.ENGLISH, "Role created for UserGroup - " + userGroupName);
    
        int type = RoleConstants.TYPE_REGULAR;
    
        // adding the role
        Role role = RoleLocalServiceUtil.addRole(userId, Role.class.getName(), 0, userGroupName, titleMap, descriptionMap, type, null, null);
    
        // assigning the UserGroup to the role
        GroupLocalServiceUtil.addRoleGroups(role.getRoleId(), new long[]{userGroup.getGroupId()}); // need to pass groupId and not userGroupId
    }
    
  5. 现在你会写这个代码-sn-p 吗?根据您的要求,有不同的地方:

    1. 带有 UI 的自定义插件 portlet 可以执行此代码。 (如果需要定期更好)
    2. 自定义插件动作钩子和代码进入 StartUpAction,在部署钩子时执行代码。钩子应该被取消部署,否则每次部署钩子时都会运行。 (一次性使用更好)
    3. 自定义插件升级钩子,在部署期间根据升级条件执行一次代码。 (一次性使用更好)
    4. 使用Beanshell,服务器管理脚本选择Beanshell粘贴代码-sn-p执行。你需要有正确的 import 语句,然后只有 code-sn-p,你就可以开始了。有关 Beanshell 用法的示例,您可以查看my other answer。 (一次性使用更好)

即使在这一切之后,您仍然需要努力为每个角色授予权限 ;-)

希望这会有所帮助。

【讨论】:

  • 为了让其他用户知道,请在问题中也包含指向您 Liferay 帖子的链接,反之亦然。这有助于社区知道它是否在某个地方得到了回答。将节省社区的宝贵时间。谢谢。 liferay.com/community/forums/-/message_boards/message/46355079
  • @PrakashK 非常感谢“需要传递 groupId 而不是 userGroupId”这条评论
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2019-07-18
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多