为client_credentials流

时间:2016-11-03 16:36:47

标签: spring-boot spring-security-oauth2

我们为oauth2客户端提供了以下客户端配置,这些客户端在spring boot 1.4.0中运行良好:

@Configuration
@ConfigurationProperties(prefix = "pmc.oauth.client")
public class OAuthClientConfig {

@NotNull
private String scope;

@NotNull
private String clientSecret;

@NotNull
private String clientId;

@NotNull
private String accessTokenUri;

private int clientReadTimeout = 60000;
private int clientConnectTimeout = 60000;

@Bean
public OAuth2ProtectedResourceDetails oAuth2ProtectedResourceDetails() {
    ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
    resourceDetails.setAccessTokenUri(accessTokenUri);
    resourceDetails.setClientId(clientId);
    resourceDetails.setClientSecret(clientSecret);
    resourceDetails.setScope(Collections.singletonList(scope));
    return resourceDetails;
}

@Bean
public OAuth2ClientContext oauth2ClientContext() {
    DefaultOAuth2ClientContext defaultOAuth2ClientContext = new DefaultOAuth2ClientContext();
    return defaultOAuth2ClientContext;
}

@Bean
public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails oAuth2ProtectedResourceDetails, OAuth2ClientContext oauth2ClientContext) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oAuth2ProtectedResourceDetails, oauth2ClientContext);
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

    restTemplate.setRequestFactory(factory);
    return restTemplate;
}
}

更新到Spring-Boot 1.4.1后,我注意到当自动装配OAuth2RestTemplate时,OAuth2ProtectedResourceDetails的另一个实现优先(由于org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ProtectedResourceDetailsConfiguration - 自动配置它将AuthorizationCodeResourceDetails的bean标记为我们自己定义的ClientCredentialsResourceDetails类型的bean。

我知道我可以通过不为其余模板bean自动装配resourceDetails和clientContext并直接提供具体实现来解决这个问题,但我只是想知道我们是否以一种春天团队无意的方式配置我们的休息模板?

有关如何为client_credentials流正确配置其余模板的任何想法?

干杯, 本

2 个答案:

答案 0 :(得分:2)

我正在努力解决同样的问题。但是,我发现如果您添加注释@ EnableOAuth2Client注释以及:

security.oauth2.client.grant-type = client_credentials

您将获得正确注入的ClientCredentialsResourceDetails详细信息实例,而不是AuthorizationCodeResourceDetails。此外,尝试排除OAuth2ProtectedResourceDetailsConfiguration不起作用。这是一个包私人类。如果您尝试按名称排除它,您将收到一条错误消息,指出它不是自动配置类。查看OAuth2RestOperationsConfiguration类的代码。它是基于检查security.oauth2.client前缀中的属性来确定要分配哪个资源的。

答案 1 :(得分:1)

我现在陷入了同样的问题。我的解决方案是为我的ResourceDetails bean使用一个命名bean,并在我创建其余模板时使用@Qualifier注入正确的bean(在oAuth2RestTemplate方法的参数中)。

虽然在1.4.0和1.4.1之间进行版本升级,但知道这个问题的确切原因会很高兴。