0

如何使用 SecurityContextHolder 摆脱 WebFilter 中的阻塞。我试图将身份验证设置放在 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);
}
4

1 回答 1

-1

您似乎正在尝试使用 Spring Security 的阻塞基础设施。如果我没记错的话,SecurityContextHolderThreadLocal基于的;这种方法在给定请求未在单个线程上处理的反应性环境中不起作用。

您可能想看看Spring Security 中即将推出的 WebFlux 支持

于 2017-07-24T12:07:09.757 回答