JSF对直接对象的访问控制

时间:2015-02-10 04:12:03

标签: jsf jsf-2

我有一个JSF页面contentEdit.xhtml,它接受一个请求参数" code"加载内容以进行编辑和其他相关操作。为了提供访问控制,我创建了一个过滤器ContentAccessFilter并将其应用于contentEdit.xhtml,以检查当前用户是否被授权使用" code"。

标识的内容。

ContentAccessFilter的片段:

        boolean isAuthorized = false;
        String userId = httpReq.getRemoteUser();
        String code = httpReq.getParameter("code");

        if (code != null && !code.isEmpty())
        {
            ContentDAO dao = ContentDAO.getInstance();
            isAuthorized = dao.isContentAuthorized(code, userId);
        }

        if (!isAuthorized)
        {
            httpRes.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

对于contentEdit.xhtml的第一个条目,过滤器正常工作,因为代码参数在第一个条目期间始终存在,方法是调用锚点html标记中的/contentArea.xhtml?code=cnn。但是,当对contentEdit.xhtml进行后续操作时,代码参数将丢失。例如,我有这样的按钮。

<p:commandButton value="Download" action="#{contentView.downloadContent}"/>
<p:commandButton value="Publish" action="#{contentView.publishContent}"/>

单击该按钮将调用与contentEdit.xhtml相同的URL,而参数代码不包含在请求URL中。此缺失参数在过滤器中失败。

在这种情况下,使用Servlet过滤器是否有正确的方法来实现访问控制?如果是,如何在触发commandButton时包含请求参数?

1 个答案:

答案 0 :(得分:0)

过滤器是在网络应用中实施授权的好方法......您走在正确的轨道上。

最好的方法是使用过滤器,但将code参数值存储在会话(javax.servlet.http.HttpSession)中,这样就不需要在查询字符串中传递参数了请求。您可以在第一个请求的会话数据中设置code属性,并在收到新请求时检索它。

如果必须使用查询字符串为每个请求传递code值,则需要在查询字符串创建中使用includeViewParams参数来保留code参数在生成的URL中。 BalusC(JSF上帝)比任何人都更好地解释了这一点...... https://stackoverflow.com/a/17745573/3858863