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

Kur*_*usu 1 java liferay

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

使用Liferay API,是否可以通过编程方式为门户网站中存在的每个用户组添加角色?

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

就像是

for(i = 0; i < userGroups.size(); i++){
    roles.add(userGroups[i].getName());
}
Run Code Online (Sandbox Code Playgroud)

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

roles.assignUserGroup(userGroups[i]);
Run Code Online (Sandbox Code Playgroud)

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

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

Pra*_*h K 5

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

您可以使用Liferay的API进行编程,因为那是liferay还能创建不同类型的角色并将用户,用户组等分配给角色的方式。

您只需要深入研究源代码即可执行此操作。检查源代码RoleLocalServiceImpl,UserGroupLocalServiceImpl和GroupLocalServiceImpl。

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

  1. 使用UserGroupLocalServiceUtil.getUserGroups(companyId)提取所有用户组
  2. 完成后循环遍历:

    for (UserGroup userGroup : userGroups) {
       ... // steps to follow
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在您会写这个代码片段吗?根据您的要求,有很多地方:

    1. 具有UI的自定义插件portlet来执行此代码。(更好,如果需要定期)
    2. 自定义插件的动作挂钩,代码位于StartUpAction内,在部署挂钩时执行代码。挂钩应取消部署,否则将在每次部署挂钩时运行。(最好一次性使用)
    3. 自定义插件升级挂钩,根据升级条件在部署期间执行一次代码。(最好一次性使用)
    4. 使用BeanShell的,Server Administration→交通Script→交通Select Beanshell→交通Paste the code-snippet→交通Execute。您需要具有正确的import语句,然后仅是代码片段,您便可以使用。有关Beanshell用法的示例,您可以查看我的其他答案。(最好一次性使用)

即使完成了所有这些,您仍然必须尽一切努力来允许每个角色;-)

希望这会有所帮助。