【问题标题】:How can I get the client IP address of requests in Spring Boot?如何在 Spring Boot 中获取请求的客户端 IP 地址?
【发布时间】:2020-03-17 16:30:17
【问题描述】:

我的安全配置有问题,我需要创建一个正在访问我的应用程序的 Ip 列表。

我的问题是以动态方式为我的所有应用程序请求获取 Ip。 但是我不想为我的应用程序的所有请求添加 HttpServletRequest,我想要的是在每个请求之前调用的方法,甚至在 SecurityConfig 事件之前。

我尝试做的是使用 AuthenticationProvider 获取请求 HttpServletRequest 然后获取我的客户端的 Ip。问题是我找不到创建单个类的方法,它连接到我的所有请求。这是我的代码:

public abstract class IPAddressBasedAuthenticationProvider implements AuthenticationProvider {

  /**
   * Context http request
   */
  @Autowired
  private HttpServletRequest request;

  @Override
  public Authentication authenticate(Authentication authentication) throws AuthenticationException {

      String ipAddress = request.getRemoteAddr();
      System.out.println(ipAddress);
      return authentication;
  }
}

我的想法是我的请求将在此代码中传递,然后显示我的客户 Ip。

我尝试在我的控制器类中自动装配它,但我的应用程序没有执行。 我可以做些什么来完成这项工作?

【问题讨论】:

标签: java spring spring-boot servlets


【解决方案1】:

我使用了不同的方式来获取我的客户请求的地址。

我创建了一个名为 WebConfig 的类,它实现了 WebMvcConfigurer。这个类在spring中配置了一些用法。这是这个类的代码:

@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggerInterceptor());
    }
}

此方法正在注册一个拦截器,此拦截器将拦截请求,并使用您创建的方法将在发送某些请求时执行它。例如我的代码:

public class LoggerInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) {

        System.out.println(request.getRemoteAddr());
        return true;
    }
}

在我的情况下,我使用“preHandle”方法来获取我的客户端请求的 Ip,每次有人通过请求调用我的应用程序时都会调用此方法,并且在 spring 处理请求之前调用我的方法,它可以使用作为安全配置,因为您可以返回 false,在这种情况下请求将不会执行。但是对于这种用法,spring boot 还有其他方法。

如果我做错了什么,请纠正我。

【讨论】:

  • 虽然是一个有效的选项,但您应该考虑准确研究何时调用拦截器。特别是因为您添加了它可以用作安全机制的提示。安全性通常由 Spring Security 本身通过 Spring Security 过滤器链 (stackoverflow.com/questions/41480102/…) 处理,这是一个确定请求有效性的有序列表。使用过滤器链,您可以拦截请求,即在任何身份验证尝试之前,如果您由于 IP 无效而需要阻止它。
  • @BeWu 如果我的安全配置由于 ip 无效而阻止了请求,是否意味着我的 LoggerInterceptor 不会执行?如何获取谁先执行的信息?如果我的日志是例如被阻止的ip,但他们之前被阻止,这意味着我不会得到任何Ip..
  • 你可以随时检查日志或调试它。如果我没记错的话,你可以在调试或跟踪日志中看到执行的弹簧安全过滤器链。确定执行顺序的一种简单方法是在拦截器的 prehandle 方法中插入一个日志输出,并检查它是在链之前、之后还是作为链的一部分记录的。这样您至少可以检查您的解决方案是否符合您的要求。
  • @BeWu 如果我理解正确,您建议我在我的应用程序执行我拥有的每个类(安全性和拦截器)时放置某种 o 记录器,但我的问题是我没有知道安全配置是如何工作的,因为它在我的应用程序启动时执行,之后,spring 如何控制这个配置?或者至少,在哪里?
  • 每次收到请求时都会执行安全过滤器链,如果您提高 Spring Security 的日志级别,您可以看到它的日志(因此您看到它被执行)您需要做的就是检查您写出的ip是在链之前还是之后打印的。安全配置是在启动时配置的,但执行和验证发生在任何传入请求之前,包括 http 请求,或使用“@PreAuthorize”等注释注释的方法调用,以及在“@PostFilter”的情况下的方法执行之后。我强烈推荐我在第一条评论中发布的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多