【问题标题】:Async spring security WebFilter异步弹簧安全 WebFilter
【发布时间】:2017-12-28 17:18:54
【问题描述】:

如何使用 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-boot spring-security reactive-programming spring-webflux


    【解决方案1】:

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

    您可能想看看upcoming WebFlux support in Spring Security

    【讨论】:

    • 那么请您告诉我一个方法,我如何为没有密码的用户使用 UserDetailsRepository? (应用程序放在 Web 服务器后面,它使用 SSO 并设置所需的标头)
    • 您是否尝试过我列出的博文中解释的方法? (使用 EnableWebFluxSecurity 并提供您的UserDetailsRepository?完成后,请打开一个新的 SO 问题并展示您尝试过的内容。
    • 我如何为没有密码的用户使用UserDetailsRepository,使用标头值进行授权?
    猜你喜欢
    • 2019-02-03
    • 2023-01-03
    • 2018-09-08
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多