如何使用WebFilter处理SecurityContextHolder中的块。我试着在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);
}发布于 2017-07-24 12:07:09
您似乎正在尝试使用Security中的阻塞基础设施。如果我没记错的话,SecurityContextHolder就是ThreadLocal-based;这种方法不能在一个给定的请求不能在单个线程上处理的反应性环境中工作。
您可能想看看Spring安全中即将出现的WebFlux支持。
https://stackoverflow.com/questions/45258260
复制相似问题