Liferay 7.4:如何在Servlet中检查文件条目权限?
在Liferay门户Servlet中获取PermissionChecker并检查文件权限
为什么PermissionThreadLocal.getPermissionChecker()返回null?
普通的HttpServlet没有经过Liferay的认证管道,导致PermissionThreadLocal中未初始化权限检查对象,所以返回null。
解决步骤
1. 继承Liferay的BaseServlet(推荐方式)
Liferay提供的BaseServlet会自动集成门户上下文,确保请求经过认证流程后,PermissionThreadLocal中能获取到有效的PermissionChecker实例。
代码示例:
import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.servlet.BaseServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends BaseServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { PermissionChecker permissionChecker = PermissionThreadLocal.getPermissionChecker(); // 此时permissionChecker已初始化,可用于权限检查 } }
2. 普通HttpServlet手动初始化PermissionChecker
如果无法继承BaseServlet,可以从请求中提取当前用户信息,手动创建并设置PermissionChecker:
import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionCheckerFactoryUtil; import com.liferay.portal.kernel.security.permission.PermissionThreadLocal; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.model.User; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) { User currentUser = (User) request.getAttribute(WebKeys.USER); if (currentUser != null) { try { PermissionChecker permissionChecker = PermissionCheckerFactoryUtil.create(currentUser); PermissionThreadLocal.setPermissionChecker(permissionChecker); // 后续使用permissionChecker执行权限检查 } catch (Exception e) { // 处理用户初始化异常 } } } }
3. 检查文件权限的具体实现
以文档库(Document Library)中的文件为例,通过PermissionChecker验证用户是否有查看权限:
import com.liferay.document.library.kernel.model.DLFileEntry; import com.liferay.document.library.kernel.service.DLFileEntryLocalServiceUtil; import com.liferay.portal.kernel.security.permission.ActionKeys; // 假设已知目标文件的fileEntryId long targetFileEntryId = 12345; DLFileEntry targetFile = DLFileEntryLocalServiceUtil.getDLFileEntry(targetFileEntryId); // 检查VIEW权限 boolean hasViewPermission = permissionChecker.hasPermission( targetFile.getGroupId(), DLFileEntry.class.getName(), targetFile.getFileEntryId(), ActionKeys.VIEW ); if (hasViewPermission) { // 用户有权限,返回文件内容或跳转至文件页面 } else { // 用户无权限,返回403 Forbidden或提示信息 }
4. 确保Servlet路径被Liferay过滤器处理
在web.xml配置Servlet映射时,确保路径处于Liferay的过滤器链覆盖范围内(如避免使用完全独立的根路径),或在liferay-plugin-package.properties中配置上下文参数,保证请求经过PortalSessionFilter等认证相关过滤器。
内容的提问来源于stack exchange,提问作者Sumair Ahmed
相关产品推荐
相关产品推荐

