gpt4 book ai didi

java - graphql-java 嵌套解析器在不同的线程中执行,具有不同的 Spring 安全上下文

转载 作者:行者123 更新时间:2023-12-04 17:38:36 28 4
gpt4 key购买 nike

我正在使用 graphql-java,它在不同的线程中执行不同的嵌套解析器。

我有一个关于 spring security 的自定义过滤器,它从 Authorization Header 解析 Bearer token 并将其添加到当前的 spring security 上下文中。

我暂时能够通过监听 ContextRefreshedEvent 并将策略强制为全局来解决问题,如您在此处所见:

    @EventListener
fun setupSecurityContext(event: ContextRefreshedEvent) {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL)
}

我对这个解决方案不满意,因为当我想接收作为解析器上的参数传递的 token 时,我必须通过全局静态调用访问解析器上的 token 。

SecurityContextHolder.getContext().authentication.principal

我认为这不是一个好的做法。我想来自一个请求的数据可以通过不同的线程暴露给另一个用户。

最佳答案

我在使用改造客户端时遇到了同样的问题。我只需要像这样将 spring 委托(delegate)执行程序设置为 okhttp 调度程序:

@Bean
DelegatingSecurityContextExecutorService dispatcherExecutor() {
return new DelegatingSecurityContextExecutorService(
new ThreadPoolExecutor(
0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
new SynchronousQueue<>(), Util.threadFactory("OkHttp Dispatcher", false)
)
);
}

@Bean
OkHttpClient okHttpClient() {
var interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);

return new OkHttpClient.Builder()
.connectTimeout(retrofitConnectionTimeout, TimeUnit.SECONDS)
.readTimeout(retrofitConnectionTimeout, TimeUnit.SECONDS)
.addInterceptor(interceptor)
.dispatcher(new Dispatcher(dispatcherExecutor()))
.build();
}

graphql呢,请看graphql.execution.ExecutorServiceExecutionStrategy。它允许设置 graphql 异步调用执行器服务,因此您可以在此处传递 spring 委托(delegate)执行器服务。

关于java - graphql-java 嵌套解析器在不同的线程中执行,具有不同的 Spring 安全上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55588266/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com