我正在尝试以编程方式添加角色。它最初有效。我可以在数据库中看到它,但是当我以管理员身份登录门户时,当我进入角色页面时收到错误“角色暂时不可用”。
这是我执行角色添加的代码:
Date now = new Date();
Long defaultCompanyId = PortalUtil.getDefaultCompanyId();
Long defaultUserId = (long) 20123;
Long roleClassNameId = ClassNameLocalServiceUtil.getClassNameId(Role.class);
Long roleId = CounterLocalServiceUtil.increment();
Role role = RoleLocalServiceUtil.createRole(roleId);
role.setName("ERIC_TEST_ROLE");
role.setDescription("This is Erics Test Role from Java Portlet");
role.setTitle("ERIC_TEST_ROLE");
role.setType(1); // role type. 1=regular, 2=site, 3=organization
role.setUserId(defaultUserId);
role.setCompanyId(defaultCompanyId);
role.setClassNameId(roleClassNameId);
role.setClassPK(roleId);
role.setCreateDate(now);
role.setModifiedDate(now);
RoleLocalServiceUtil.addRole(role);
在catalina.out中,错误消息是:
2023-11-29 15:42:03.150 错误 [https-jsse-nio-8443-exec-9][PortletRequestDispatcherImpl:295] 无法分派请求:java.lang.IllegalArgumentException:有人可能试图绕过权限检查器:{companyId=20095,name=com.liferay.portal.kernel.model.Role,primKey=33020,范围=4} 2023-11-29 15:42:03.151 错误 [https-jsse-nio-8443-exec-9][PortletServlet:109] 无法处理 portlet com_liferay_roles_admin_web_portlet_RolesAdminPortlet: org.apache.jasper.JasperException: java.lang.IllegalArgumentException: 有人可能试图绕过权限检查器:{companyId=20095,name=com.liferay.portal.kernel.model.Role,primKey=33020,scope=4} javax.portlet.PortletException:org.apache.jasper.JasperException:java.lang.IllegalArgumentException:有人可能试图绕过权限检查器:{companyId = 20095,name = com.liferay.portal.kernel.model.Role,primKey =33020,范围=4} 在 com.liferay.portlet.internal.PortletRequestDispatcherImpl.dispatch(PortletRequestDispatcherImpl.java:298) ~[portal-impl.jar:?] 在 com.liferay.portlet.internal.PortletRequestDispatcherImpl.include(PortletRequestDispatcherImpl.java:114) ~[portal-impl.jar:?] 在 com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.include(MVCPortlet.java:611) ~[portal-kernel.jar:?] 在 com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.include(MVCPortlet.java:627) ~[portal-kernel.jar:?] 在 com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.doView(MVCPortlet.java:172) ~[portal-kernel.jar:?] 在 com.liferay.portal.kernel.portlet.LiferayPortlet.doDispatch(LiferayPortlet.java:278) ~[portal-kernel.jar:?] 在 com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.doDispatch(MVCPortlet.java:500) ~[portal-kernel.jar:?] 在 com.liferay.roles.admin.web.internal.portlet.RolesAdminPortlet.doDispatch(RolesAdminPortlet.java:562) ~[bundleFile:?] 在 javax.portlet.GenericPortlet.render(GenericPortlet.java:291) ~[portlet.jar:3.0.1] 在 com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.render(MVCPortlet.java:300) ~[portal-kernel.jar:?]
任何帮助表示赞赏。
您似乎错过了为新角色设置所有者/权限相关的资源。找出您需要做什么的最简单方法是:
在 Liferay 的源代码中搜索执行此操作的位置并检查它们。例如,我搜索了对
createRole
的调用,并发现了一个听起来非常有前途的 SiteRoleDemoDataCreatorImpl,其中完成了此操作:
Role role = createRole(companyId, roleName, RoleConstants.TYPE_SITE);
if (Validator.isNotNull(permissionsXML)) {
addPermissions(
role, permissionsXML, ResourceConstants.SCOPE_GROUP_TEMPLATE,
String.valueOf(GroupConstants.DEFAULT_PARENT_GROUP_ID));
}
并且 addPermission 来自超类:
Document document = SAXReaderUtil.read(permissionsXML);
Element rootElement = document.getRootElement();
List<Element> resources = rootElement.elements("resource");
for (Element resource : resources) {
String resourceName = resource.elementText("resource-name");
List<Element> actionIds = resource.elements("action-id");
for (Element actionId : actionIds) {
addResourcePermission(role, resourceName, scope, primKey, actionId.getText());
}
}
(这是来自当前的主分支。您可能需要适应特定的版本 - 但我不希望这段代码发生重大变化..