异步弹簧安全WebFilter

时间:2017-07-22 19:15:02

标签: spring-boot spring-security reactive-programming spring-webflux

如何使用SecurityContextHolder摆脱WebFilter中的阻止。我尝试将auth设置放在Mono的doOnSuccess(...)和thenEmpty(...)中,但它从未被调用过。

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    HttpHeaders headers = exchange.getRequest().getHeaders();
    long internalId = Long.parseLong(headers.get(INTERNAL_ID_HEADER).get(0));
    String email = headers.get(EMAIL_HEADER).get(0);

    Mono<User> userMono = Mono.just(internalId)
            .flatMap(userRepository::findById)
            .switchIfEmpty(userRepository.save(new User().setId(internalId)
                            .setFirstName(getFirstName(email))
                            .setLastName(getLastName(email))
                            .setEmail(email)
                    )
            );

    SecurityContextHolder.getContext().setAuthentication(userMono.block());

    return chain.filter(exchange);
}

1 个答案:

答案 0 :(得分:-1)

您似乎正在尝试使用Spring Security中的阻止基础架构。 如果我没记错的话,SecurityContextHolder是基于ThreadLocal的;该方法不适用于在单个线程上未处理给定请求的反应性环境

您可能需要查看upcoming WebFlux support in Spring Security