Spring WebFlux中的ReactiveSecurityContextHolder为空

7月13日

我正在尝试将ReactiveSecurityContextHolder与Spring WebFlux一起使用。不幸的是,SecurityContext为空:

@Configuration
public class Router {

    @Bean
    public RouterFunction<ServerResponse> routes(Handler handler) {
        return nest(
                path("/bill"),
                route(
                        GET("/").and(accept(APPLICATION_JSON)), handler::all));
    }

    @Component
    class Handler {

        Mono<ServerResponse> all(ServerRequest request) {

            ReactiveSecurityContextHolder.getContext()
                .switchIfEmpty(Mono.error(new IllegalStateException("ReactiveSecurityContext is empty")))
                .map(SecurityContext::getAuthentication)
                .map(Authentication::getName)
                .flatMap(s -> Mono.just("Hi " + s))
                .subscribe(
                        System.out::println,
                        Throwable::printStackTrace,
                        () -> System.out.println("completed without a value")
                );

            return ok().build();
        }

    }

}

此代码始终引发IllegalStateException。

如果我添加一个subscriberContext像显示在这里

Authentication authentication = new TestingAuthenticationToken("admin", "password", "ROLE_ADMIN");

ReactiveSecurityContextHolder.getContext()
        .switchIfEmpty(Mono.error(new IllegalStateException("ReactiveSecurityContext is empty")))
        .map(SecurityContext::getAuthentication)
        .map(Authentication::getName)
        .flatMap(s -> Mono.just("Hi " + s))
        .subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication))
        .subscribe(
                System.out::println,
                Throwable::printStackTrace,
                () -> System.out.println("completed without a value")
        );

它可以正常工作并打印“ Hi admin”。但这不是重点,文章说“在WebFlux应用程序中,它subscriberContext是使用自动设置的ReactorContextWebFilter”。因此,我应该能够获取登录的用户。

我有这个配置:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http.authorizeExchange()
            .anyExchange().authenticated()
            .and().formLogin()
            .and().build();
    }

    @Bean
    public MapReactiveUserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

        UserDetails admin = User.withDefaultPasswordEncoder()
            .username("admin")
            .password("password")
            .roles("ADMIN")
            .build();

        return new MapReactiveUserDetailsService(user, admin);
    }

}

我在这里想念什么吗?如果将断点放在ReactorContextWebFilter中,则可以看到在每个请求之前已正确调用了断点。但是我的ReactiveSecurityContextHolder总是空的...

xtermi2

您必须返回要在其中访问ReactiveSecurityContextHolder的流您不允许在另一个流中订阅,或者必须手动进行Reactor上下文切换。

@Component
class Handler {
    Mono<ServerResponse> all(ServerRequest request) {
        return ReactiveSecurityContextHolder.getContext()
                .switchIfEmpty(Mono.error(new IllegalStateException("ReactiveSecurityContext is empty")))
                .map(SecurityContext::getAuthentication)
                .map(Authentication::getName)
                .flatMap(s -> Mono.just("Hi " + s))
                .doOnNext(System.out::println)
                .doOnError(Throwable::printStackTrace)
                .doOnSuccess(s -> System.out.println("completed without value: " + s))
                .flatMap(s -> ServerResponse.ok().build());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

serverRequest 中的正文为空,带有 ServerRequest(Spring Webflux)

使用Spring WebFlux测试时,DTO的内部列表为空

Spring webflux 5.2.3 bodyToMono 在 onStatus 中的空 Mono 之后调用

Spring WebFlux-WebFilter中的statusCode为null

Spring + Hibernate @autowired在ConstraintValidator中为空

Spring AbstractHttpMessageConverter中的HttpInputMessage为空

Spring MongoRepository为空

Spring @Value为空

Spring Webflux中的flatMap()与subscribe()

在Spring 5中缓存WebFlux

在Spring Webflux中捕获响应

Spring webflux 中的异常处理

Spring @Async与Spring WebFlux

获取NoSuchBeanDefinitionException:Spring WebFlux中没有类型为ServerRequest的合格bean

Spring WebFlux-通过WebClient为Mono内列表中的每个元素发送HTTP请求

在Spring Boot中自动接线时为空指针

loadUserByUsername(String username)中的username参数为空-Spring Boot

Spring Boot错误响应中的“ message”字段为空

Spring-@Configuration中的@Autowired bean为空

在Spring MVC中为MongoTemplate实例获取空指针异常

来自 Spring Boot 的 @Autowired 服务在 WAR 中为空

动作名称在 spring 4 mvc 中为空

Java Future-Spring Authentication在AuditorAware中为空

@ModelAttribute 字段在 Spring 控制器中为空

Spring Boot中的数据库字段为空的问题

Spring数据MongoDB聚合中的属性始终为空

Spring MVC 提供的 JSP 页面中的 ${channels} 为空

Spring boot @Value 属性在测试用例中为空

Spring Boot @Value为空