在webflux中创建bean时如何访问spring websession

问题描述 投票:0回答:1

我在我的应用程序中使用 keycloak,并尝试通过在执行访问令牌调用时发送两个必需的参数 client_session_state 和 client_session_host 来动态配置反向通道注销 url。

为了实现这一目标,我的想法是通过添加自定义 ParameterConverter 来设置这两个 client_session_state 和 client_session_host 参数来覆盖 bean ReactiveOAuth2AccessTokenResponseClient。

    @Bean
    public ReactiveOAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> reactiveOAuth2AccessTokenResponseClient() {
        WebClientReactiveAuthorizationCodeTokenResponseClient accessTokenResponseClient = new WebClientReactiveAuthorizationCodeTokenResponseClient();
        accessTokenResponseClient.addParametersConverter(authorizationGrantRequest -> {
            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
            params.add("client_session_state", RequestContextHolder.currentRequestAttributes().getSessionId());
            params.add("client_session_host", "http://localhost:8080");
            return params;
        });
        return accessTokenResponseClient;
    }

这里的问题是我无法在 webflux 中使用 RequestContextHolder,因为它将绑定到本地线程,这违背了反应式概念。我在这里使用它来读取会话id时会遇到异常。

任何人都可以给我一个提示,如何通过不使用 RequestContextHolder 来获取当前的网络会话。我将不胜感激任何建议。谢谢!

spring keycloak spring-webflux
1个回答
0
投票

回答自己,我找到了从上下文视图中读取网络会话的方法:

Mono.deferContextual(Mono::just)
                .filter(contextView -> contextView.hasKey(ServerWebExchange.class))
                .map(contextView -> contextView.get(ServerWebExchange.class))
                .flatMap(ServerWebExchange::getSession)
                .flatMap(webSession -> ...do logic)
© www.soinside.com 2019 - 2024. All rights reserved.