Spring Security 配置:Basic Auth + Spring Cloud Gateway
Posted
技术标签:
【中文标题】Spring Security 配置:Basic Auth + Spring Cloud Gateway【英文标题】:Spring Security Configuration: Basic Auth + Spring Cloud Gateway 【发布时间】:2020-06-21 12:47:25 【问题描述】:我有一个响应式 Spring Boot 应用程序,它负责使用 Spring Cloud Gateway(即它是一个 API 网关)将请求路由到下游服务。该应用程序有一些需要保护的执行器端点,因此我只想为此使用简单的安全性,例如基本身份验证。
我想配置应用程序,要求对 /actuator/refresh
的请求使用基本身份验证(使用配置的 Spring 安全用户和密码)进行授权。所有对其他端点的请求,即使它们包含基本身份验证,也只需要传递给下游服务。
我当前的 Spring 安全配置:
@Bean
@Order(1)
SecurityWebFilterChain securityWebFilterChain(final ServerHttpSecurity http)
http.authorizeExchange(exchanges ->
exchanges.matchers(EndpointRequest.toAnyEndpoint().excluding(HealthEndpoint.class, InfoEndpoint.class)).hasRole("ACTUATOR"); // requires Http Basic Auth
);
http.httpBasic(withDefaults()); // if not enabled, you cannot get the ACTUATOR role
return http.build();
@Bean
@Order(2)
SecurityWebFilterChain permitAllWebFilterChain(final ServerHttpSecurity http)
http.authorizeExchange(exchanges -> exchanges.anyExchange().permitAll()); // allow unauthenticated access to any endpoint (other than secured actuator endpoints?)
http.httpBasic(ServerHttpSecurity.HttpBasicSpec::disable); // disable Http Basic Auth for all other endpoints
return http.build();
API 网关不会传播用于下游服务的请求。 Spring Boot 服务在此设置中返回 401,而预期/需要 200。
任何想法为什么这个配置不起作用/应该如何配置?
【问题讨论】:
什么不起作用? API 网关不传播用于下游服务的请求。 Spring Boot 服务在此设置中返回 401,而预期/需要 200。 【参考方案1】:我不确定是什么损坏了,但是您是否尝试过将它们组合在一起并只使用一个过滤器?
@EnableWebFluxSecurity
public class MyExplicitSecurityConfiguration
@Bean
public MapReactiveUserDetailsService userDetailsService()
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("ACTUATOR")
.build();
return new MapReactiveUserDetailsService(user);
@Bean
SecurityWebFilterChain securityWebFilterChain(final ServerHttpSecurity http)
http.authorizeExchange(exchanges ->
exchanges.matchers(EndpointRequest.toAnyEndpoint()
.excluding(HealthEndpoint.class, InfoEndpoint.class))
.hasRole("ACTUATOR");
exchanges.anyExchange().permitAll();
).httpBasic(withDefaults());
return http.build();
另一个好处可能是启用调试日志记录并查看失败的原因。
这是通过在application.properties
中定义来完成的
logging.level.org.springframework.security=DEBUG
【讨论】:
我相信我遇到了同样的问题,问题是当您将Authorization
标头传递给非执行器端点时,Spring Security 正在处理它并拒绝它而不是让它通过。以上是关于Spring Security 配置:Basic Auth + Spring Cloud Gateway的主要内容,如果未能解决你的问题,请参考以下文章
Spring security Basic Authentication - 401 Unauthorized with correct credentials
不推荐使用属性“security.basic.enabled”:不再可自定义安全自动配置
相同 API 的 Spring Security Basic Auth 和 Form 登录
Spring Security Salt Configuration with MD5 using basic String object