java - Spring boot 找不到 bean OAuth2AuthorizedClientService

标签 java spring-boot spring-security-oauth2 keycloak

我正在使用 webflux 和 keycloak 构建 OIDC 客户端。我的 spring 应用程序无法启动,因为它找不到下面的 bean:

Consider defining a bean of type 'org.springframework.security.oauth2.client.OAuth2AuthorizedClientService' in your configuration.

接着...

build.gradle
dependencies {
    compile "org.springframework.boot:spring-boot-starter-webflux:2.0.3.RELEASE"
    compile "org.springframework.security:spring-security-oauth2-client"
    compile "org.springframework.security:spring-security-oauth2-jose"
    compile "org.springframework.boot:spring-boot-devtools"

    compile group: 'org.keycloak', name: 'keycloak-services', version: '4.0.0.Final'
    compile group: 'org.keycloak', name: 'keycloak-admin-client', version: '4.0.0.Final'

    compile "org.projectlombok:lombok"
    compile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: '4.0.0.Beta4'

    testCompile('org.springframework.boot:spring-boot-starter-test')
}

application.yml
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: your-app-client-id
            client-secret: your-app-client-secret
          facebook:
            client-id: your-app-client-id
            client-secret: your-app-client-secret
          keycloak:
            provider: keycloak
            client-id: auth-api
            client-secret: 727bea9d-6e01-433a-960b-83ac5d939adf
            client-name: auth-api
            client-authentication-method: basic
            authorization-grant-type: authorization_code
            redirect-uri-template: '{baseUrl}/login/oauth2/code/{registrationId}'
            scope:
              - openid
              - profile
              - email

        provider:
          keycloak:
            authorization-uri: http://70.314.280.xxx/auth/realms/master/protocol/openid-connect/auth
            token-uri: http://70.314.280.xxx/auth/realms/master/protocol/openid-connect/token
            user-info-uri: http://70.314.280.xxx/auth/realms/master/protocol/openid-connect/userinfo
            jwk-set-uri: http://70.314.280.xxx/auth/realms/master/protocol/openid-connect/certs
            user-name-attribute: preferred_username

显然它无法创建 ClientRegistration 对象,但不确定为什么 spring 不会从 yaml 文件中选择 oauth2 设置部分?

谢谢你的帮助。

最佳答案

我今天遇到了同样的问题,像往常一样使用 Spring + IntelliJ 调试源代码非常容易,原因是这行代码:

map.from(properties::getRedirectUri).to(builder::redirectUriTemplate);

代码也可以在这里找到:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientPropertiesRegistrationAdapter.java#L57

所以,你不应该使用 redirect-uri-template但是 redirect-uri在你的 yaml 文件中。我按照教程并粘贴了他们的 yaml 文件后陷入了这个问题。

关于java - Spring boot 找不到 bean OAuth2AuthorizedClientService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51180856/

相关文章:

java - 使用快照在JAVA AWS sdk中创建EC2实例

java - JNA 在个人电脑上的不同行为

java - 将 Spring boot/cloud 与 Amazon AWS lambda 一起使用不会注入(inject)值

Hibernate 多对多关系无限循环?

spring-security - 同时为多个社交网络启用OAuth2Sso

java - Spring boot Security,Oauth2 注销,使 session 无效,以便在授权服务器中完成身份验证和批准周期

java - 模拟@AuthenticationPrincipal 参数

ftp - 如何强制我的 Java 应用程序使用 Java JRE 1.6 而不是 1.7?

java - ThreadPoolTask​​Executor 中的 @Autowired 不起作用

mysql - java.lang.NullPointerException : Cannot invoke "com.proj.my.repository.OrderRepository.save(Object)" because "this.orderRepository" is null