Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拒绝j_安全检查上的GET方法_Java_Security_Jakarta Ee_Weblogic_Websphere - Fatal编程技术网

Java 拒绝j_安全检查上的GET方法

Java 拒绝j_安全检查上的GET方法,java,security,jakarta-ee,weblogic,websphere,Java,Security,Jakarta Ee,Weblogic,Websphere,有没有办法只允许POST请求进行j_安全检查?我想拒绝得到。 我使用基于表单的安全性,只允许帖子进行安全检查。如果通过GET发出登录请求,则应拒绝该请求。是,您可以拒绝GET请求。在安全约束部分的web.xml文件中,可以指定允许的http方法。在下面的xml中,此安全约束所允许的唯一方法是POST方法。j_安全检查只允许post方法 <security-constraint> <display-name>Your security constraint</di

有没有办法只允许POST请求进行j_安全检查?我想拒绝得到。
我使用基于表单的安全性,只允许帖子进行安全检查。如果通过GET发出登录请求,则应拒绝该请求。

是,您可以拒绝GET请求。在安全约束部分的web.xml文件中,可以指定允许的http方法。在下面的xml中,此安全约束所允许的唯一方法是POST方法。j_安全检查只允许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>

您的安全约束
您的资源名称
/URL模式
邮递

您需要重新表述您的问题

j_安全检查通常用于登录页面

如果您请求安全资源,但未经身份验证,则会自动重定向到登录页面(假设应用程序配置为使用基于表单的安全性)

如果您的资源不应该因为GET请求而受到质疑,请遵循Doug提到的方法。例如,如果您想保护对myaccount的POST调用(Servlet的模式),那么只有在发出HTTP POST时,才会将您重定向到登录页面,而GET请求即使没有用户身份验证也会被接受


这意味着,您希望允许经过身份验证的用户访问POST请求,同时允许每个人访问GET请求。

由于JAAS使用GET方法的安全问题,我尝试了各种方法,在JBOSS(Tomcat)服务器上尝试了同样的操作

  • 在url模式/j_security_check上使用web.xml安全约束来仅使用POST-这对于JAAS机制不像对普通servlet那样有效

  • 将登录详细信息从登录页面传递到中间servlet,中间servlet检查请求方法,如果不是GET,则转发到j_security_check。-这不管用,太复杂了

  • 创建一个过滤器,该过滤器将检查请求方法,并且只对发送到j_security_check的POST消息进行调用-这不起作用,因为JAAS在web容器中的位置更深,并且在过滤器机制之前被调用

  • 创建一个阀门,在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!");
    }
    

    这确实有效。

    我正在考虑实施的另一种方法:

    • 在反向代理/负载平衡器(如nginx/apache)中阻止对j_security_check的所有请求(POST请求除外)
    例如,在Apache2.4上,这是可行的:

    <LocationMatch ".*j_security_check">
        AllowMethods POST
    </LocationMatch>
    
    
    AllowMethods POST
    
    • 如果我需要更多的定制,我可以使用我自己的servlet重新实现j_安全检查

    但这是否会限制整个系统只接受POST请求?这里需要的是只限制/j_security_id发布。或者你的意思是j_security_id应该有自己的吗?在上面的例子中,你会用/j_security_check替换url模式。真的有可能用过滤器捕获对j_security_check的请求吗?我知道JAAS会吃掉这些请求,并直接用302响应原始请求的URL,而不会将请求传递给过滤器。我们一直在过滤器中使用j_security_check URL。我们在Websphere服务器中运行它们。每次有人登录时,过滤器都会运行。我们还使用仅在j_security_check上运行的筛选器来限制用户可以拥有的会话数。奇怪。我刚刚对映射到/*的Payara做了一个小过滤器,它记录所有请求,并且日志中不包含对j_security_id的请求?(我一直在努力使用阀门记录所有内容,但也失败了,请参见[)