【问题标题】:Configuring Spring OAuth2 Client for client_credentials flow为 client_credentials 流配置 Spring OAuth2 Client
【发布时间】:2017-03-17 08:29:44
【问题描述】:

我们为我们的 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 之上。

我知道我可以通过不为 rest 模板 bean 自动装配 resourceDetails 和 clientContext 并直接提供具体实现来解决这个问题,但我只是想知道我们是否正在以 Spring 团队不打算的方式配置我们的 rest 模板?

关于如何为 client_credentials 流正确配置我们的 rest 模板有什么想法吗?

干杯, 本

【问题讨论】:

    标签: spring-boot spring-security-oauth2


    【解决方案1】:

    我在同样的问题上苦苦挣扎。但是,我发现如果您添加注释 @EnableOAuth2Client 注释以及:

    security.oauth2.client.grant-type = client_credentials

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

    【讨论】:

      【解决方案2】:

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

      如果在 1.4.0 和 1.4.1 之间进行版本升级,很高兴知道此问题的确切原因。

      【讨论】:

      • 似乎也是一个有效的解决方案。我走了你可能会说脏的方式,现在不是通过接口的类型(OAuth2ProtectedResourceDetails)而是通过它的具体实现(ClientCredentialsResourceDetails)自动装配,因为它是我感兴趣的实际实现。我可能已经排除了 OAuth2ProtectedResourceDetailsConfiguration像这样的自动配置机制拾取:@EnableAutoConfiguration(exclude = OAuth2ProtectedResourceDetailsConfiguration .class)。不过,我仍然很好奇如何以“正确”的方式做到这一点。
      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 2020-03-27
      • 2019-09-17
      • 2020-05-26
      • 2018-10-04
      • 2015-05-10
      • 2021-11-11
      • 2021-01-13
      相关资源
      最近更新 更多