【问题标题】:Not able to access POST data in Spring Security custom filter无法访问 Spring Security 自定义过滤器中的 POST 数据
【发布时间】:2017-05-05 18:26:11
【问题描述】:

我正在开发一个需要访问 POST 数据 JSON 的应用程序。我的代码是

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.filter.GenericFilterBean;

public class LoginFilter extends GenericFilterBean {

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {

    System.out.println("filtered /login request: " +  servletRequest.getParameter("idToken"));
    filterChain.doFilter(servletRequest, servletResponse);
  }
}

当我运行应用程序时

$ curl -v -X POST -H "Content-Type: application/json" -d '{"idToken" : "EWRE@#$RWER@#23434W$"}' http://localhost:8080/login

我在日志中看到null

2017-05-06 06:23:31.153  INFO 89727 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 2 ms
filtered /login request: null

我错过了什么?

【问题讨论】:

  • ServletRequest.getParameter(...) 只检索请求参数。您可能必须自己解码身体(例如使用杰克逊)
  • 除此之外,您为什么要创建一个过滤器来处理登录?常规端点更适合此 imo。
  • @Riiverside,在春天,安全几乎总是由过滤器处理。包括登录和注销。
  • @hooknc:实际上不是。是的,保护端点是通过过滤器完成的(出于显而易见的原因),但登录/注销仍然是常规端点(也可以是用户创建的自定义端点,而不是 spring security 提供的默认端点)。例外情况可能是基本/摘要身份验证,因为这些身份验证确实会在每个请求上进行检查。当应该为(几乎)每个请求执行某些操作时(例如检查用户是否真的可以访问所请求的资源),就会使用过滤器。
  • 我不确定您所说的“常规端点”是什么意思。你的意思是一个常规的 url,比如 /login?那么是的,你是对的。但是,登录(对于 Spring)的技术行为仍然发生在过滤器中。请看下面的例子OpenIDAuthenticationFilterUsernamePasswordAuthenticationFilter

标签: java spring spring-boot spring-security


【解决方案1】:

您将 json 作为请求正文而不是参数传递。试试这样读,

servletRequest.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

但是 servletRequest.getReader() 返回一个只能读取一次的阅读器。

【讨论】:

    猜你喜欢
    • 2011-08-23
    • 2014-07-28
    • 2011-07-23
    • 2013-07-22
    • 2014-10-24
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多