我在我的应用程序中使用 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 来获取当前的网络会话。我将不胜感激任何建议。谢谢!
回答自己,我找到了从上下文视图中读取网络会话的方法:
Mono.deferContextual(Mono::just)
.filter(contextView -> contextView.hasKey(ServerWebExchange.class))
.map(contextView -> contextView.get(ServerWebExchange.class))
.flatMap(ServerWebExchange::getSession)
.flatMap(webSession -> ...do logic)