gpt4 book ai didi

spring-cloud - 使用 Feign RequestInterceptor 无法访问的安全上下文

转载 作者:行者123 更新时间:2023-12-04 04:13:24 25 4
gpt4 key购买 nike

目标是使用 RequestInterceptor 从安全上下文中附加一些数据,但问题是调用 SecurityContextHolder.getContext().getAuthentication()即使它不为null,也总是返回null(我相信100%)。

据我了解,这是因为拦截器已创建并正在其他线程中运行。

我该如何解决这个问题并从安全上下文中获取实际数据?

我的服务:

@FeignClient(value = "api", configuration = { FeignConfig.class })
public interface DocumentService {

@RequestMapping(value = "/list", method = RequestMethod.GET)
DocumentListOperation list();
}

我的 FeignConfig 类:
@Bean
public RequestInterceptor requestInterceptor() {
return new HeaderInterceptor(userService);
}

public class HeaderInterceptor implements RequestInterceptor {

private UserService userService;

public HeaderInterceptor(UserService userService) {
this.userService = userService;
}

@Override
public void apply(RequestTemplate requestTemplate) {
Authentication a = SecurityContextHolder.getContext().getAuthentication()

requestTemplate.header("authentication", a.toString());
}
}

最佳答案

我设法弄明白了,感谢我找到的文章 here

首先你需要初始化 HystrixRequestContext HystrixRequestContext.initializeContext(); .

您必须创建自己的 Context 来存储您需要传递给 Hystrix 子线程的信息。

这是示例:

public class UserHystrixRequestContext {

private static final HystrixRequestVariableDefault<User> userContextVariable = new HystrixRequestVariableDefault<>();

private UserHystrixRequestContext() {}

public static HystrixRequestVariableDefault<User> getInstance() {
return userContextVariable;
}
}

您必须注册新的并发策略来包装 Callable 接口(interface)
@Component
public class CustomHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {

public CustomHystrixConcurrencyStrategy() {
HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
}

@Override
public <T> Callable<T> wrapCallable(Callable<T> callable) {
return new HystrixContextWrapper<T>(callable);
}

public static class HystrixContextWrapper<V> implements Callable<V> {

private HystrixRequestContext hystrixRequestContext;
private Callable<V> delegate;

public HystrixContextWrapper(Callable<V> delegate) {
this.hystrixRequestContext = HystrixRequestContext.getContextForCurrentThread();
this.delegate = delegate;
}

@Override
public V call() throws Exception {
HystrixRequestContext existingState = HystrixRequestContext.getContextForCurrentThread();
try {
HystrixRequestContext.setContextOnCurrentThread(this.hystrixRequestContext);
return this.delegate.call();
} finally {
HystrixRequestContext.setContextOnCurrentThread(existingState);
}
}
}
}

所以在调用 Callable 对象之前,我们将新线程的上下文设置为父上下文。

完成后,您应该能够在 Hystrix 子线程中访问新定义的上下文
User = UserHystrixRequestContext.getInstance().get();
希望这会帮助某人。

关于spring-cloud - 使用 Feign RequestInterceptor 无法访问的安全上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719809/

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