2016-11-03 2 views
0

Мы имеем следующую конфигурацию клиента для наших клиентов oauth2 в месте, которое работает достаточно хорошо с пружинным ботинке 1.4.0:Настройка Spring OAuth2 Client для client_credentials потока

@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 I «Было замечено, что при автоподготовке OAuth2RestTemplate другая реализация OAuth2ProtectedResourceDetails имеет приоритет (из-за org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ProtectedResourceDetailsConfiguration - автоконфигурация, которая помечает bean of AuthorizationCodeResourceDetails как первичный) по нашему собственному определенному компоненту тип ClientCredentialsResourceDetails.

Я знаю, что могу исправить это, не автоувеличивая resourceDetails и clientContext для остальных фасонных компонентов и напрямую поставляя конкретные реализации, но мне просто интересно, настраиваем ли мы наш шаблон отдыха таким образом, который не был рассчитан весной команда?

Любые мысли о том, как правильно настроить наш шаблон отдыха для потока client_credentials?

Cheers, Бен

ответ

1

я сейчас застрял в том же номере. Мое решение состоит в том, чтобы использовать именованный компонент для моего компонента ResourceDetails и использовать @Qualifier для ввода правильного, когда я создаю шаблон для остальных (в вашем случае в параметрах метода oAuth2RestTemplate).

Было бы неплохо узнать точную причину этой проблемы при обновлении версии между 1.4.0 и 1.4.1.

+0

Также представляется действительным решением. Я пошел, вы могли сказать грязный путь, и теперь я не могу использовать autwiring не по типу интерфейса (OAuth2ProtectedResourceDetails), а по конкретной его реализации (ClientCredentialsResourceDetails), так как это фактическая реализация, в которой я заинтересован. Возможно, я исключал возможность OAuth2ProtectedResourceDetailsConfiguration выбранный механизмом автоконфигурации следующим образом: @EnableAutoConfiguration (exclude = OAuth2ProtectedResourceDetailsConfiguration .class). Мне все же любопытно, как это сделать, «правильный». – jimonthebarn

1

Я боролся с той же проблемой. Тем не менее, я обнаружил, что если добавить аннотацию @ EnableOAuth2Client аннотации вместе с:

security.oauth2.client.grant типа = client_credentials

вы получите правильное инъецированное ClientCredentialsResourceDetails детали экземпляра, а не AuthorizationCodeResourceDetails. Кроме того, попытка исключить OAuth2ProtectedResourceDetailsConfiguration не работает. Это пакет частного класса. Если вы попытаетесь исключить его по имени, вы получите сообщение об ошибке, поскольку оно не является классом автоконфигурации. Посмотрите на код для класса OAuth2RestOperationsConfiguration. Это то, что определяет, какой ресурс будет выделяться на основе проверки свойств в префиксе security.oauth2.client.

Смежные вопросы