java - 如何在 Liferay 中复制现有的组织角色并将其添加到已经具有原始角色的用户中?
问题描述
所以我正在使用 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);
}
}
推荐阅读
- reactjs - 故事书.js。如何将组件编译为 ES5 lib
- tensorflow - 当 GPU 是系统唯一的显卡时,我可以对它进行编程吗?
- python - 使用意大利面时间序列模型进行预测
- javascript - 取消选中复选框时从输入中删除值
- c++ - 隐式复制的构造函数智能指针
- amazon-web-services - 我可以在 AWS 中阻止 pod 和 ElastiCache 之间的连接吗
- c# - Xamarin PostAsync 没有内容响应
- javascript - 为什么我没有实体的参考 ID?
- java - Intellij 构建损坏的 JAR 工件
- android - 在 Recyclerview 中加载 PublisherAdView