liferay 7.4 - 我尝试以编程方式添加角色,但在尝试查看角色页面时出现错误

问题描述 投票:0回答:1

我正在尝试以编程方式添加角色。它最初有效。我可以在数据库中看到它,但是当我以管理员身份登录门户时,当我进入角色页面时收到错误“角色暂时不可用”。

这是我执行角色添加的代码:

    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 roles liferay-7
1个回答
0
投票

您似乎错过了为新角色设置所有者/权限相关的资源。找出您需要做什么的最简单方法是:

在 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());
  }
}

(这是来自当前的主分支。您可能需要适应特定的版本 - 但我不希望这段代码发生重大变化..

© www.soinside.com 2019 - 2024. All rights reserved.