【发布时间】: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