【问题标题】:How can I use an OAuth2RestTemplate in a scheduled task?如何在计划任务中使用 OAuth2RestTemplate?
【发布时间】:2016-12-25 19:24:01
【问题描述】:

我有两台资源服务器:一台具有用于发送电子邮件通知的 API,另一台运行计划任务。当计划任务开始时,我想调用电子邮件服务来通知用户他们的任务正在开始。两种服务都使用 OAuth2 进行身份验证。计划任务服务设置了客户端凭据,以便它可以通过提供其客户端凭据来获取访问令牌:


为此,我将 Spring Boot 与 Spring Security OAuth2 结合使用。任务服务有一个 OAuth2RestTemplate 来调用电子邮件服务。当计划任务启动并尝试使用 OAuth2RestTemplate 时,它​​会尝试将 OAuth2ClientContext 作为 sesson-scoped bean。显然,它不会找到一个,因为我不是在请求线程中执行,而是在后台任务线程中操作。我得到了这个例外:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
  'scopedTarget.oauth2ClientContext': Scope 'session' is not active for the current thread; 
  consider defining a scoped proxy for this bean if you intend to refer to it 
  from a singleton

由于我使用静态客户端凭据进行系统到系统身份验证,因此我认为没有充分的理由使用会话范围的数据来处理我的访问令牌。我希望有一个单例 OAuth2ClientContext bean,任何线程都可以使用它通过 OAuth2RestTemplate 发出请求。

我该如何配置?

【问题讨论】:

  • 我需要做一些类似的事情——Quartz 调度程序需要调用一个作业,该作业将访问受 OAuth2 保护的 REST 服务。我不能使用基于用户名/密码的 OAuth2 流,而是基于客户端 ID 的流。你能分享你的代码吗?还是帮忙?

标签: spring-boot spring-security-oauth2 spring-scheduled


【解决方案1】:

结果很简单。我想要一个单例 bean,所以我创建了一个单例 bean:

@Primary
@Bean
public OAuth2ClientContext singletonClientContext() {
    return new DefaultOAuth2ClientContext();
}

在我的@Configuration 类中,Spring 将它连接到我的 OAuth2RestTemplate 并且我的计划任务能够调用电子邮件服务。为了更好地衡量,我添加了 @Primary 注释以确保这个 bean 优于 Spring Boot 创建的任何东西(不确定是否需要)。

【讨论】:

  • 你不需要@Primary。一个“正常”的 bean 足以关闭 Boot 的自动配置等效项(如果有的话)。
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多