java - 如何复制 Liferay 中现有的组织角色并将其添加到已拥有原始角色的用户中?

标签 java oracle liferay liferay-7

因此,我正在使用 Liferay 7/Oracle 11g,并尝试复制指定子类型的现有组织角色,重命名它们,然后将这些新角色添加到具有原始角色的用户。

因此按子类型获取角色非常简单,

添加新角色后出现第一个问题,尝试查看新角色时收到错误消息:

Someone may be trying to circumvent the permission checker: {companyId=20115, name=com.liferay.portal.kernel.model.Role, primKey=31701, scope=4}

第二个问题是获取具有原始组织角色的用户,因为我找不到向我提供该信息的现有 Liferay 类。据我所知,它保存在 USERGROUPROLE 表中,因此我可以使用自己的 SQL 选择从那里读取它,但我更希望有一个 Liferay 类提供该信息。

List<Role> lRole = RoleLocalServiceUtil.getSubtypeRoles(String.valueOf(adoptFromYear));
for(Role role : lRole) {
    long roleId = CounterLocalServiceUtil.increment();
    Role newRole = RoleLocalServiceUtil.createRole(roleId);
    newRole.setClassPK(roleId);
    newRole.setCompanyId(role.getCompanyId());
    newRole.setUserId(role.getUserId());
    newRole.setUserName(role.getUserName());
    newRole.setClassName(role.getClassName());
    newRole.setTitle(role.getTitle());
    newRole.setDescription(role.getDescription());
    newRole.setCreateDate(new Date());
    newRole.setType(role.getType());
    newRole.setName(replaceOrAppendYear(role.getName(), newYear));
    newRole.setSubtype(String.valueOf(newYear));

    RoleLocalServiceUtil.addRole(newRole);

    //assign Users that have base Role, the new Role
    long[] aUserId = UserLocalServiceUtil.getRoleUserIds(role.getRoleId());

    for(long userId : aUserId) {
        RoleLocalServiceUtil.addUserRole(userId, newRole.getRoleId());
    }
}

更新:

我使用 UserLocalServiceUtil 的另一个 addRole 方法修复了第一个问题,代码如下:

List<Role> lRole = RoleLocalServiceUtil.getSubtypeRoles(String.valueOf(adoptFromYear));
for(Role role : lRole) {
    Role newRole = RoleLocalServiceUtil.addRole(role.getUserId(), Role.class.getName(), 
        CounterLocalServiceUtil.increment(), replaceOrAppendYear(role.getName(), newYear), 
        role.getTitleMap(), role.getDescriptionMap(), role.getType(), 
        String.valueOf(newYear), null);

    //add User from base Role to new Role
    long[] aUserId = UserLocalServiceUtil.getRoleUserIds(role.getRoleId());
    //aUserId still empty

    for(long userId : aUserId) {
        RoleLocalServiceUtil.addUserRole(userId, newRole.getRoleId());
    }
}

因此,获取具有特定组织角色的所有用户的问题仍然存在。

最佳答案

所以我对问题的解决方案如下,我使用另一个 addRole 方法添加一个新角色,并且还在数据库中创建了附加条目,因此不再有错误消息。

关于我的第二个问题,我只是使用liferay API从UserGroupRole表中获取所有条目,然后通过我需要的roleId过滤所有条目。这不是一个很好的解决方案,但在我的情况下,即使有数万个条目(这对我的工作来说是慷慨的),该函数每年都会被调用一次,所以 ́\_(ツ)_/̅

所以这是解决方案:

List<Role> lRole = RoleLocalServiceUtil.getSubtypeRoles(String.valueOf(adoptFromYear));
for(Role role : lRole) {
    Role newRole = RoleLocalServiceUtil.addRole(role.getUserId(), Role.class.getName(), 
        CounterLocalServiceUtil.increment(), replaceOrAppendYear(role.getName(), newYear), 
        role.getTitleMap(), role.getDescriptionMap(), role.getType(), String.valueOf(newYear), null);

    //get all User - Group (Organization) - Role Objects and filter by Role
    List<UserGroupRole> lUserGroupRole = UserGroupRoleLocalServiceUtil
        .getUserGroupRoles(QueryUtil.ALL_POS, QueryUtil.ALL_POS).stream()
        .filter(ugr -> ugr.getRoleId() == role.getRoleId()).collect(Collectors.toList());

    //add new Role to all existing Users that had the adopted role
    long[] roleIds = {newRole.getRoleId()};
    for(UserGroupRole ugr : lUserGroupRole) {
        UserGroupRoleLocalServiceUtil.addUserGroupRoles(ugr.getUserId(), ugr.getGroupId(), roleIds);
    }
}

关于java - 如何复制 Liferay 中现有的组织角色并将其添加到已拥有原始角色的用户中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57089668/

相关文章:

java - 在 JfxPane 中创建上下文菜单

java - 使用 JDBC 返回 MYSQL 中最后一行的整数

Oracle PLSQL 将日期时间截断为特定小时

sql - 在子查询中按级别连接慢

redirect - Liferay Portlet和JSF : Redirect during Render Phase

java - 是否可以将 HSQLDB 模式即时更改为只读?

java - Oracle Web 服务日期在 Java 代码中返回 Null,但在 SOAP UI 中不返回 Null

java - 错误 [Jsr168Dispatcher :38] Could not find action There is no Action mapped for action name default. - [未知位置]

java - 使用 Spring MVC 表单提交 portlet

java - Android 上的开发者 ROOT 访问权限有哪些优势?