UserInfoRestTemplateFactory设置失败,包含ResourceServerConfigurerAdapter和两个spring-cloud-services-starters

时间:2017-10-04 10:23:37

标签: spring-boot spring-cloud spring-security-oauth2 pcfdev

我稍微更新了一个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

因此,它尝试使用spring-cloud-services-starters中应该完全独立的OAuth2ProtectedResourceDetails来设置我的应用程序安全性;我希望它只使用外部JWT键。

任何人都可以帮助我如何使用配置和发现服务来使用PCF部署的应用程序,还可以使用外部JWT令牌进行身份验证设置吗?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的事情。几个月前我看到了这个帖子。我也升级到了春季启动1.5.4和云Dalston.SR4,这让我超越了驼峰。感谢。

I was shown http://start.spring.io正在使用spring boot 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)。

因此,通过添加client-id和client-secret,我猜测(完全猜测)它创建了具有更好(更近)范围的所需OAuth2ProtectedResourceDetails。

它正在寻找" userInfoRestTemplateFactory"当我们不需要查找用户信息时,就是我指向这个方向。

我的服务在PivotalWS上成功部署(run.pivotal.io),使用spring boot 1.5.9和Dalston.SR4使用io.pivotal.spring.cloud:spring-cloud-services-dependencies:1.5。 0.RELEASE

答案 1 :(得分:1)

将spring-boot-starter-parent更改为1.5.2.RELEASE,spring-cloud-dependencies为Dalston.RC1,spring-cloud-services-dependencies 1.5.0.RELEASE