繁体   English   中英

在 Spring Boot Security 中获取客户端 IP 地址

[英]get client ip address in spring boot security

这是我在这里的第一个问题,如果有什么不对的地方,我很抱歉,请纠正我)。
我正在开发具有 Spring Boot 安全性的 Spring Boot 应用程序。 我使用RestController来创建我的 API。
我需要记录所有尝试访问我的 API 的客户端的 IP 地址,即使他们没有经过身份验证。
我可以在身份验证后或客户端通过此访问公共 API 时获取客户端的 IP(从HttpServletRequest获取):

    @GetMapping("/api/public/getDeviceList")
    public List<Device> getDeviceList(HttpServletRequest httpServletRequest) {
        System.out.println(httpServletRequest.getRemoteHost());
    }

但是当客户端使用错误的凭据访问私有 API 时,我没有得到这些 IP 地址。
如何检索这些信息?

getRemoteHost()方法以字符串形式返回客户端系统的名称。

getRemoteAddr()方法返回访问 Java Web 应用程序的客户端 IP 地址

在你的方法控制器上试试这个

System.out.println(httpServletRequest.getRemoteAddr());

如果您的服务器是本地服务器,它将返回0:0:0:0:0:0:0:1但如果您在本地网络上的另一台计算机上进行测试,则应显示正确的 IP,例如192.168.1.4

我得到了在安全链中添加自定义过滤器的解决方案。 在这个过滤器中,我可以记录我需要的所有信息。 创建过滤器:

public class CustomSecurityFilter extends GenericFilterBean {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        System.out.println("Enter custom filter");
        System.out.println("method:"+request.getMethod() + "\nurl:"+request.getRequestURI()+"\nip address:"+request.getRemoteAddr());
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

然后在 configure(HttpSecurity http) 方法的 WebSecurityConfigurerAdapter 中添加此过滤器

@Configuration
@EnableWebSecurity
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {




    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
        http.csrf().disable().authorizeRequests()
                .antMatchers("/api/private/**").authenticated()
                .and().httpBasic()
        .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// -----Add new filter in chain-----
      http.addFilterBefore(new CustomSecurityFilter(), 
      SecurityContextPersistenceFilter.class);

    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/api/public/**");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM