spring oauth和客户端凭证M2M呼叫

时间:2017-06-14 18:19:10

标签: spring-cloud spring-cloud-netflix spring-oauth2

我有一个使用 # force the server VM (remove on 32-bit client JVMs) -server spring-cloud-secuirty保护的前端网站。我的所有后端资源都使用spring-cloud-oauth2保护。

来自UI的这些资源服务的所有请求都是通过Zuul网关授权的,但我的问题是计划在每日基础上运行的后端任务,或者是由电子邮件触发的后端任务。这些任务未经授权,正如我从阅读中理解的那样,它们应该被认证为@EnableResourceServer。但在尝试与安全资源通信之前,我无法弄清楚如何配置假装客户端以获取访问代码。

我已经创建了一个示例project,在这个项目中,除了任务服务

之外,每件事情都有效

1 个答案:

答案 0 :(得分:1)

添加下面的拦截器就可以了,但我不确定这是最好的解决方案

@Component
public class Interceptor implements RequestInterceptor {

    private final OAuth2RestTemplate template;

    public Interceptor(ClientCredentialsResourceDetails oauth2RemoteResource) {
      template = new OAuth2RestTemplate(oauth2RemoteResource, new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()));
    }

    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("Authorization", "bearer " + template.getAccessToken().getValue());
    }
}

更好的方法

经过更多阅读后,我发现spring-cloud-security已经有了一个拦截器,所以我们只需要声明一个OAuth2FeignRequestInterceptor类型的bean,如下所示

@Configuration
@EnableOAuth2Client
@Slf4j
public class OAuth2FeignAutoConfiguration {

    @Bean
    public OAuth2FeignRequestInterceptor oAuth2FeignRequestInterceptor(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) {
        return new OAuth2FeignRequestInterceptor(oauth2ClientContext,details);
    }


}