在 Spring Boot 中安排 OAuth + Feign

Posted

技术标签:

【中文标题】在 Spring Boot 中安排 OAuth + Feign【英文标题】:OAuth + Feign with Scheduled in Spring Boot 【发布时间】:2017-01-21 16:29:37 【问题描述】:

我有两个不时相互通信的 Spring Boot 应用程序。其中一种方法是 Feign 客户端使用 @Scheduled 发送请求。

我正在使用 RequestInterceptor 从 restTemplate 添加授权令牌。

@Component
@Scope("prototype")
public class OAuthInterceptor implements RequestInterceptor 
@Autowired
private OAuth2RestOperations restTemplate;

@Autowired
private AppContext appContext;

@Override
public void apply(RequestTemplate requestTemplate) 
    if (appContext != null) 
        ...
    

    requestTemplate.header("Authorization", "bearer " + restTemplate.getAccessToken());

问题是,appContext 在通过 Scheduled 执行时总是不同于 null 事件。如果通过请求执行,则可以正常工作。

如何配置以检查此拦截器是按计划执行的还是按用户请求执行的?

错误是:

No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

这里是 AppContext ,其中包含有关用户会话的一些信息,当通过 Scheduled 执行时,我不需要查看它。

@Component
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, value="session")
public class AppContext implements Serializable 
...

【问题讨论】:

一个讨厌的解决方案是尝试捕获 BeanCreationException,但我希望有一个适当的解决方案来解决这个问题。 【参考方案1】:

在Feign and Spring Security 5 - Client Credentials 上查看我的回复。我认为 AppContext 和 OAuth2RestOperations 的使用会弄乱你的代码。你应该避免它。

【讨论】:

以上是关于在 Spring Boot 中安排 OAuth + Feign的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Spring OAuth Java 配置

Spring Boot 和 OAuth2 社交登录,无法获取 refreshToken

在 Spring Boot OAuth2 中跳过 OAuth 用户批准

Spring Boot:在标头中发送 JWT(OAuth)

在 Spring Boot OAuth2RestOperations 中刷新 OAuth 令牌

独立资源服务器(Spring Boot 2 + OAuth + JWT)在 Spring-boot 从 1.2.x 升级到 2.x 后给出 UsernameNotFoundException