Spring Security Spring安全配置:基础Auth + Spring Cloud Gateway

js5cn81o  于 2023-10-20  发布在  Spring
关注(0)|答案(2)|浏览(209)

我有一个Reactive Sping Boot 应用程序,它负责将请求路由到下游服务,使用Spring Cloud Gateway(即它是API网关)。应用程序有一些执行器端点,需要保护,因此我想使用一个简单的安全性,比如基本的auth。
我想配置这个应用程序,要求对/actuator/refresh的请求使用基本的auth进行授权(使用配置的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是预期/必需的。
任何想法为什么这个配置不工作/它应该如何配置,否则?

fcg9iug3

fcg9iug31#

我不知道是什么坏了,但你有没有尝试结合他们,只有一个过滤器?

@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
cs7cruho

cs7cruho2#

来自文档:
Spring Cloud Gateway构建在Sping Boot 、Spring WebFlux和Project Reactor之上。因此,许多熟悉的同步库(例如Spring Data和Spring Security)和模式在使用Spring Cloud Gateway时可能不适用。如果您不熟悉这些项目,我们建议您开始阅读它们的文档,以便在使用Spring Cloud Gateway之前熟悉一些新概念。
这是到文档Spring Cloud的链接,我有同样的问题,我无法解决-这可能与我提到的文档有关。我希望这会有所帮助。

相关问题