JSF 对直接对象的访问控制

JSF Access control on direct object

我有一个 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 的第一个条目,过滤器正常工作,因为代码参数始终存在于第一个条目期间,通过从锚点调用 /contentArea.xhtml?code=cnn html 标签。但在contentEdit.xhtml上有后续操作时,code参数丢失。例如,我有这样的按钮。

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

点击按钮会调用与contentEdit.xhtml相同的URL,但请求中不包含参数代码URL。这个缺失的参数在过滤器中失败。

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

过滤器是在 Web 应用程序中实现授权的好方法...您走对了。

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

如果您必须使用查询字符串在每个请求中传递 code 值,则需要在创建查询字符串时使用 includeViewParams 参数来保留 code 生成的 URL 中的参数。 BalusC(JSF 之神)比任何人都解释得更好......