nginx 反向代理背后 spring 安全性的身份验证问题

Authentication problems with spring security behind nginx reverse proxy

我在 Spring 安全和 nginx 反向代理服务器方面遇到问题。在我的 Spring 引导应用程序中,我的大部分路由都受到 Basic Auth 的保护。但是,我希望有一组特定的路由仅受 nginx 基本身份验证保护。

不幸的是,我遇到了路由总是要求进行两种身份验证的问题。

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

这是我的 Spring 安全设置。

    @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(.*)$  break;
    proxy_pass          http://172.17.0.1:8888/reporting;
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/htpasswd.users;
  }

在我的 nginx 服务器配置中,我定义了这些 header 参数:

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?

我解决了。我的重写规则没有转发到 Spring 中的 /reporting,我需要清除身份验证 header。

以下位置配置适合我:

  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 "";    
  }