liferay页面中的身份验证

时间:2014-01-30 10:35:56

标签: authentication liferay liferay-6

我们在liferay页面上有一个portlet。我们想对每个执行的操作方法提出许可。例如,在页面A上,我们已经登陆了一个XYZ portlet。现在我们希望每当从这个portlet执行任何操作时,我们想要检查用户是否有角色来执行此操作。

在portlet的Action方法中放置代码不是一个好方法,因为我们有大约20个这样的页面和portlet。

我们是否可以使用某种过滤器,以便在用户有权访问内容时检查每个操作请求。

谢谢...

3 个答案:

答案 0 :(得分:2)

我的想法。

使用过滤器拦截所有请求

您可以向Liferay Servlet添加过滤器以检查每个请求。 为此,您可以使用hook-plugin

看看这个:

过滤器问题是您无法访问ThemeDisplay或使用PortalUtil.getUser(request)

所以你必须使用这样的工作:

private User _getUser(HttpServletRequest request) throws Exception {
    HttpSession session = request.getSession();

    User user = PortalUtil.getUser(request);

    if (user != null) {
        return user;
    }

    String userIdString = (String) session.getAttribute("j_username");
    String password = (String) session.getAttribute("j_password");

    if ((userIdString != null) && (password != null)) {
        long userId = GetterUtil.getLong(userIdString);

        user = UserLocalServiceUtil.getUser(userId);
    }

    return user;
}

过滤请求

要过滤请求,您必须:

  • 页面ID(Liferay中的布局ID)
  • portlet id
  • portlet生命周期

再次使用过滤器很痛苦,因为你可以获得ThemeDisplay。使用ThemeDisplay很容易获得这些参数(使用真实对象实例)。

因此,您必须在请求中将此作为参数。

final String portletId = ParamUtil.get((HttpServletRequest) servletRequest, "p_p_id", "");
final String layoutId = ParamUtil.get((HttpServletRequest) servletRequest, "plid", "");
final String portletLifecycle = ParamUtil.get((HttpServletRequest) servletRequest, "p_p_lifecycle", "");

生命周期详情:

portletLifecycleint,其含义是:

  • 0:RENDER
  • 1:ACTION(感兴趣的人)
  • 2:RESOURCE

我认为通过这些数据,您可以定义用户是否能够采取行动。

您可以从用户获取用户角色。 您可以获取链接到请求的当前页面和portlet。 并且您可以知道请求是否是操作请求。

Liferay祝你好运。

答案 1 :(得分:1)

您可以向Liferay添加可自由配置的权限,请参阅Developer Guide for detailed information。我对此的第一个猜测是,这些会影响“模型资源”,例如:您的portlet正在处理的数据,而不是portlet资源,例如单个portlet本身的权限。将portlet权限视为Liferay定义的权限,将模型资源视为权限,您可以在这些权限上为自己的行为提供自己的词汇表,例如: “UPDATE_ADDRESS”等。

这些权限通常与角色绑定,角色授予用户/用户组/等。

根据这种可变性,如果您可以编写过滤器来一般性地检查权限,或者它取决于多个单独的操作调用,则取决于您的权限的性质。

如果您确定存在通用解决方案,请查看PortletFilters,它们的行为与ServletFilters类似。这些可以很容易地提供许可检查的住所。

在如此简短的回答中很难涵盖这个话题,我希望能够为你提供足够的资源来继续你的追求。

答案 2 :(得分:0)

您可以滥用某些现有的portlet权限,例如“添加到页面”,并将其设置为应调用该操作的角色。 通过渲染和操作阶段验证“具有用户必要的权限”。

或者您可以创建新权限并通过portlet-configuration进行配置。这种方式比较干净,但很难。