【发布时间】:2010-07-22 18:29:26
【问题描述】:
有没有办法只允许对 j_security_check 的 POST 请求?我想拒绝 GET。 我正在使用基于表单的安全性,并且只想允许帖子到 j_security_check。如果通过 GET 发出登录请求,则应拒绝该请求。
【问题讨论】:
标签: java security jakarta-ee weblogic websphere
有没有办法只允许对 j_security_check 的 POST 请求?我想拒绝 GET。 我正在使用基于表单的安全性,并且只想允许帖子到 j_security_check。如果通过 GET 发出登录请求,则应拒绝该请求。
【问题讨论】:
标签: java security jakarta-ee weblogic websphere
由于使用 GET 方法的 JAAS 的安全问题,我一直尝试在 JBOSS(Tomcat) 服务器上做同样的事情,我尝试了各种方法。
在 url 模式 /j_security_check 上使用 web.xml 安全约束以仅使用 POST - 这对 JAAS 机制不起作用,因为它对普通 servlet 起作用。
将登录详细信息从登录页面传递给一个中间 servlet,该 servlet 检查请求方法,如果不是 GET,则转发到 j_security_check。 - 这不起作用,而且过于复杂。
创建一个过滤器来检查请求方法,并且只在 POST 消息上调用 j_security_check - 这不起作用,因为 JAAS 在 Web 容器中更深,并且在过滤器机制之前被调用。
创建一个 Valve,它在 JAAS 之前被调用。
通过在invoke方法中添加以下内容:
HttpServletRequest req = (HttpServletRequest) request;
if (req.getMethod().equals("GET")) {
log.warn("Someone is trying to use a GET method to login!!");
request.getRequestDispatcher("/login.jsp").forward(req, response);
throw new ServletException("Using a GET method on security check!");
}
这确实有效。
【讨论】:
是的,您可以拒绝 GET 请求。在安全约束部分的 web.xml 文件中,您可以指定允许的 http 方法。在以下 xml 中,此安全约束允许的唯一方法是 POST 方法。 j_security check 将只允许 post 方法。
<security-constraint>
<display-name>Your security constraint</display-name>
<web-resource-collection>
<web-resource-name>Your resource name</web-resource-name>
<url-pattern>/The URL pattern</url-pattern>
<http-method>POST</http-method>
<web-resource-collection>
<security-constraint>
【讨论】:
您需要重新表述您的问题。
j_security check 通常用于登录页面。
如果您请求安全资源但未通过身份验证,则会自动将您重定向到登录页面(假设应用程序配置为使用基于表单的安全性)
如果您的资源不应该受到 GET 请求的挑战,请按照 Doug 提到的内容进行操作。例如,如果您想保护对 myaccount 的 POST 调用(Servlet 的模式),那么只有在发出 HTTP Post 时,您才会被重定向到登录页面,而即使没有用户身份验证,也会接受 GET 请求。
这意味着您希望允许经过身份验证的用户访问 POST 请求,而允许所有人访问 GET 请求。
【讨论】:
我正在考虑实施的另一种方法:
例如在 Apache 2.4 上这有效:
<LocationMatch ".*j_security_check">
AllowMethods POST
</LocationMatch>
【讨论】: