异步 spring 安全 WebFilter
Async spring security WebFilter
如何使用 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);
}
您似乎正在尝试使用来自 Spring 安全的阻止基础设施。
如果我没记错的话,SecurityContextHolder
是基于 ThreadLocal
的;该方法在给定请求 未在单个线程 .
上处理的反应式环境中不起作用
如何使用 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);
}
您似乎正在尝试使用来自 Spring 安全的阻止基础设施。
如果我没记错的话,SecurityContextHolder
是基于 ThreadLocal
的;该方法在给定请求 未在单个线程 .