Сбой установки UserInfoRestTemplateFactory с ResourceServerConfigurerAdapter и двумя стартерами весенних облачных сервисов
Я немного обновил пример Spring Cloud Services, чтобы проиллюстрировать мою проблему: https://github.com/spring-cloud-services-samples/greeting/compare/master...timtebeek:master
После вышеуказанных изменений я использую:
spring-cloud-services-starter-config-client:1.5.0.RELEASE
spring-cloud-services-starter-service-registry:1.5.0.RELEASE
spring-cloud-starter-oauth2:2.0.14.RELEASE
Я также добавил минимальный ResourceServerConfigurerAdapter
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}
@Override
public void configure(final ResourceServerSecurityConfigurer resources) {
resources.resourceId("greeter");
}
}
И минимальная настройка конфигурации:
security:
oauth2:
resource:
jwt:
key-uri: https://example.com/oauth/token_key
С этими изменениями мое приложение не может быть развернуто в PCF-DEV; Я не пробовал правильно PCF, но ожидаю, что результаты будут похожими. Вот сообщение об ошибке, которое я получаю:
Method userInfoRestTemplateFactory in org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerTokenServicesConfiguration required a single bean, but 2 were found: - eurekaOAuth2ResourceDetails: defined by method 'eurekaOAuth2ResourceDetails' in class path resource [io/pivotal/spring/cloud/service/eureka/EurekaOAuth2AutoConfiguration.class] - configClientOAuth2ResourceDetails: defined by method 'configClientOAuth2ResourceDetails' in io.pivotal.spring.cloud.service.config.ConfigClientOAuth2BootstrapConfiguration Action: Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
Поэтому он пытается использовать то, что должно быть полностью отделено OAuth2ProtectedResourceDetails
от весенних облачных сервисов до установки безопасности моего приложения; Где бы я хотел, чтобы он использовал только внешний ключ JWT.
Может ли кто-нибудь помочь мне с тем, как я могу использовать приложение, развернутое в PCF, используя службы конфигурации и обнаружения, а также использовать внешний токен JWT для настройки аутентификации?
2 ответа
Я столкнулся с тем же. Я видел эту тему несколько месяцев назад. Я также обновился до весенней загрузки 1.5.4 и облачного Dalston.SR4, и это заставило меня преодолеть все трудности. Благодарю.
Мне показали, что http://start.spring.io/ использует весеннюю загрузку 1.5.9. Он работает на PivotalWS, поэтому я знал, что есть решение.
Попробуйте это изменение:
security:
oauth2:
client:
client-id: someclient
client-secret: someclientpass
resource:
jwt:
key-uri: https://example.com/oauth/token_key
В моем случае client-id и client-secret являются фиктивными значениями. Я предполагаю, что, поскольку вы также используете токен JWT, вашему ресурсу не нужно проверять токен с вашим провайдером токенов JWT, только подпись (key-uri).
Поэтому, добавляя идентификатор клиента и секрет клиента, я угадываю (полностью догадываюсь), что он создает требуемые OAuth2ProtectedResourceDetails с лучшей (более близкой) областью действия.
Тот факт, что он искал "userInfoRestTemplateFactory", когда нам не нужно искать информацию о пользователях, и указал мне в этом направлении.
Мои службы успешно внедряются на PivotalWS (run.pivotal.io) с этим изменением, используя весеннюю загрузку 1.5.9 и Dalston.SR4 с io.pivotal.spring.cloud:spring-cloud-services-dependencies:1.5.0.RELEASE
Измените spring-boot-starter-parent на 1.5.2.RELEASE,spring-cloud-зависимости - Dalston.RC1, spring-cloud-services-dependencies 1.5.0.RELEASE