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 之神)比任何人都解释得更好......
我有一个 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 之神)比任何人都解释得更好......