Liferay 7.3自定义Portlet动态加载权限异常求助
Liferay 7.3 自定义Portlet全屏加载权限问题
我有一个已部署在页面上的Portlet,需要生成链接以全屏模式加载另一个模块中的自定义Portlet。内置Login Portlet可正常通过此方式加载,但加载自定义Portlet时会弹出两个红色错误框,提示“您没有访问此Portlet所需的角色”。我已拥有对应权限(将Portlet添加到页面后可正常访问),甚至使用全能管理员账号测试仍出现该问题。
相关信息
- 包含JSP文件的Portlet ID:
subscriptionmanagement_WAR_subscriptionmanagementportlet - 尝试加载的Portlet ID:
GRPSignupForm_WAR_NY511RMportlet
当前使用的代码与生成的URL
自定义Portlet的渲染URL标签
<liferay-portlet:renderURL portletName="GRPSignupForm_WAR_NY511RMportlet" var="grpPortlet" windowState="<%= WindowState.MAXIMIZED.toString() %>"> </liferay-portlet:renderURL>
生成的错误URL
http://localhost:8080/group/test/unsubscribe?p_p_id=tripitinerary_WAR_NY511RMportlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view
对比可行的Login Portlet实现
Login Portlet的渲染URL标签
<liferay-portlet:renderURL portletName="<%= PortletKeys.LOGIN %>" var="loginURL" windowState="<%= WindowState.MAXIMIZED.toString() %>"> <portlet:param name="mvcRenderCommandName" value="/login/login" /> </liferay-portlet:renderURL>
生成的正确URL
http://localhost:8080/group/test-1/unsubscribe?p_p_id=com_liferay_login_web_portlet_LoginPortlet&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&_com_liferay_login_web_portlet_LoginPortlet_mvcRenderCommandName=%2Flogin%2Flogin
自定义Portlet的代码实现
@Component( immediate = true, property = { "com.liferay.portlet.display-category=root//NYSDOT//GRP", "com.liferay.portlet.instanceable=false", "com.liferay.portlet.header-portlet-css=/css/main.css", "com.liferay.portlet.footer-portlet-javascript=/js/main.js", "com.liferay.portlet.css-class-wrapper=grh-signup-form-portlet", "javax.portlet.display-name=GRP Signup Form", "javax.portlet.init-param.template-path=/html/", "javax.portlet.init-param.add-process-action-success-action=false", "javax.portlet.init-param.config-template=/html/configuration.jsp", "javax.portlet.init-param.view-template=/html/view.jsp", "javax.portlet.init-param.edit-template=/html/edit.jsp", "javax.portlet.name=" + GRPSignupPortletKeys.GRPSIGNUP, "javax.portlet.resource-bundle=content.Language", "javax.portlet.security-role-ref=administrator,guest,power-user,user" }, service = Portlet.class ) public class GRPSignupPortlet extends GenericPortlet { ... ... }
问题原因与解决办法
1. 修正Portlet名称参数
你在liferay-portlet:renderURL中使用的portletName是Portlet的部署ID(GRPSignupForm_WAR_NY511RMportlet),但Liferay要求此处使用Portlet的注册名称(即javax.portlet.name属性对应的GRPSignupPortletKeys.GRPSIGNUP值)。内置Login Portlet使用PortletKeys.LOGIN正是遵循了这个规则。
调整后的代码示例:
<%@ page import="com.yourpackage.GRPSignupPortletKeys" %> <liferay-portlet:renderURL portletName="<%= GRPSignupPortletKeys.GRPSIGNUP %>" var="grpPortlet" windowState="<%= WindowState.MAXIMIZED.toString() %>"> </liferay-portlet:renderURL>
2. 验证URL正确性
调整后生成的URL中,p_p_id应匹配自定义Portlet的注册名称(或对应部署别名),而非之前错误的tripitinerary_WAR_NY511RMportlet——该错误说明Liferay因portletName参数错误,无法定位到目标Portlet,进而触发权限验证失败。
3. 权限配置二次确认
- 确认自定义Portlet的
javax.portlet.security-role-ref配置正确,覆盖了所需角色; - 检查控制面板→配置→系统设置→门户→权限中,是否存在针对该Portlet的额外权限限制。
内容的提问来源于stack exchange,提问作者Scott McIntosh
相关产品推荐
相关产品推荐

