Nginx反向代理后面具有Spring Security的身份验证探针

时间:2019-07-14 17:59:28

标签: spring-boot nginx spring-security reverse-proxy nginx-reverse-proxy

我对Spring Security和Nginx反向代理服务器有问题。我的大多数路由在我的Spring启动应用程序中受Basic Auth保护。但是,我希望有一组仅受nginx基本身份验证保护的路由。

不幸的是,我有一个问题,即路由始终要求同时进行两种身份验证。

我创建了一个针对此特定春季路线的位置。 spring应用程序和nginx服务器都在单独的docker容器中运行。

这是我的Spring Security设置。

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/reporting/**").permitAll()
                .antMatchers("/user/create").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                .httpBasic();
    }

这是我的位置:

  location /smartphone-reporting {
    rewrite /smartphone-reporting(.*)$ $1 break;
    proxy_pass          http://172.17.0.1:8888/reporting;
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/htpasswd.users;
  }

在我的nginx服务器配置中,我定义了以下标头参数:

server {
  ...
  # Add X-Forwarded-* headers
  proxy_set_header        X-Forwarded-Host $hostname;
  proxy_set_header        X-Forwarded-Proto $scheme;
  proxy_set_header        Upgrade $http_upgrade;
  proxy_set_header        Connection "upgrade";
  proxy_set_header        X-Cert $ssl_client_s_dn;
}

如果我在proxy_pass路由的服务器上使用curl,则会收到没有任何身份验证的响应。如果我从服务器外部发出请求,则会陷入无休止的循环,询问两种身份验证类型。

如何设置可以正常工作的nginx?

1 个答案:

答案 0 :(得分:0)

我解决了。我的重写规则在Spring中没有转发给/ reporting,因此我需要清除身份验证标头。

以下位置配置对我有用:

  location /smartphone-reporting/ {
    proxy_pass          http://172.17.0.1:8888/reporting/;
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/htpasswd.users;
    proxy_set_header Authorization "";    
  }