我对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?
答案 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 "";
}