以编程方式为每个用户组创建角色

时间:2014-12-06 21:23:32

标签: java liferay

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

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

这比通过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

1 个答案:

答案 0 :(得分:4)

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

您可以使用Liferay的API以编程方式执行此操作,因为liferay还会创建不同类型的角色,并为该角色分配用户,用户组等。

您只需要深入了解源代码即可。检查RoleLocalServiceImplUserGroupLocalServiceImplGroupLocalServiceImpl的源代码。

我正在为 Liferay v6.2 提供步骤,6.0和6.1应该没有太大的变化:

  1. 使用UserGroupLocalServiceUtil.getUserGroups(companyId)
  2. 获取所有用户组
  3. 完成循环:

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

  5. 使用RoleLocalServiceUtil.addRole( ... )创建角色,并使用GroupLocalServiceUtil.addRoleGroups( ... )

    将userGroup分配给角色
    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
    }
    
  6. 现在你会写这段代码片段吗?根据您的要求,有多种地方可供选择:

    1. 自定义插件portlet,带有用于执行此代码的UI。 (如果需要定期更好)
    2. 自定义插件动作挂钩,代码进入StartUpAction,在部署挂钩时执行代码。应该取消部署Hook,否则每次部署钩子时都会运行。 (一次性使用更好)
    3. 自定义插件升级挂钩,根据升级条件在部署期间执行一次代码。 (一次性使用更好)
    4. 使用Beanshell,服务器管理脚本选择Beanshell 粘贴代码段执行。你需要有正确的import语句,然后只需要代码片段,你就可以了。有关Beanshell使用的示例,您可以检查my other answer。 (一次性使用更好)
  7. 即使在所有这些之后,你仍然需要尽力给予每个角色许可; - )

    希望这会有所帮助。