Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到spring boot ReactiveClientRegistrationRepository_Java_Spring Boot_Spring Webclient_Spring Reactive - Fatal编程技术网

Java 未找到spring boot ReactiveClientRegistrationRepository

Java 未找到spring boot ReactiveClientRegistrationRepository,java,spring-boot,spring-webclient,spring-reactive,Java,Spring Boot,Spring Webclient,Spring Reactive,环境:Spring Boot 2.3.1,Java 11 我已经尝试了一些东西(也与spring的示例应用程序进行了比较),但到目前为止,我没有成功创建一个需要ReactiveClientRegistrationRepository的WebClient 启动spring boot应用程序时出现以下异常: required a bean of type 'org.springframework.security.oauth2.client.registration.ReactiveClientRe

环境:Spring Boot 2.3.1,Java 11

我已经尝试了一些东西(也与spring的示例应用程序进行了比较),但到目前为止,我没有成功创建一个需要
ReactiveClientRegistrationRepository
WebClient

启动spring boot应用程序时出现以下异常:

required a bean of type 'org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository'
============================
CONDITIONS EVALUATION REPORT
============================

Negative matches:
-----------------

   ReactiveOAuth2ClientAutoConfiguration:
      Did not match:
         - NoneNestedConditions 1 matched 0 did not; NestedCondition on ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition.ServletApplicationCondition found 'session' scope (ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition)
      Matched:
         - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition)

按照我对spring boot自动配置的理解,它应该使用
reactiveOAuth2Client配置
,正如在yml文件中一样,给出了所需的属性

下面是一些代码片段,如果缺少某些内容,我可以提供更多内容来获取整个上下文

主类

@Slf4j
@SpringBootApplication
@EnableConfigurationProperties(MyAppConfigurationProperties.class)
public class MyApp{

    public static void main(final String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
配置:

@Configuration
//@Import(ReactiveOAuth2ClientAutoConfiguration.class) // in the test it works with this, but should not be required: spring-boot-autoconfigure
public class MyRestClientConfig {

  @Bean
    WebClient myWebClient(WebClient.Builder builder, ReactiveClientRegistrationRepository clientRegistrations) {
//content not relevant to this problem
}
}
安全配置

@EnableGlobalMethodSecurity(securedEnabled = true)
@EnableWebSecurity
@EnableWebFluxSecurity
public class SecurityConfig {
}
application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          providerid:
            authorization-grant-type: "client_credentials"
            client-id: "myClientId"
            client-secret: "mySecret"
            user-info-authentication-method: header
        provider:
          providerid:
            token-uri: "working token-uri"
我尝试使用不同的依赖项,因此可能不需要某些依赖项。实际上需要哪些依赖项

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework.security.oauth.boot</groupId>-->
<!--            <artifactId>spring-security-oauth2-autoconfigure</artifactId>-->
<!--        </dependency>-->
        <!--        <dependency>-->
        <!--            <groupId>org.springframework.security.oauth</groupId>-->
        <!--            <artifactId>spring-security-oauth2</artifactId>-->
        <!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-oauth2-client</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.security</groupId>-->
<!--            <artifactId>spring-security-oauth2-core</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.security</groupId>-->
<!--            <artifactId>spring-security-oauth2-jose</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-webflux</artifactId>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
编辑1: 自动配置的正匹配调试

在其工作的测试中:

============================
CONDITIONS EVALUATION REPORT
============================


Positive matches:
-----------------
   ReactiveOAuth2ClientAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition)
      - NoneNestedConditions 0 matched 1 did not; NestedCondition on ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition.ServletApplicationCondition not a servlet web application (ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition)

   ReactiveOAuth2ClientConfigurations.ReactiveClientRegistrationRepositoryConfiguration matched:
      - OAuth2 Clients Configured Condition found registered clients myClientId (ClientsConfiguredCondition)
      - @ConditionalOnMissingBean (types: org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ReactiveOAuth2ClientConfigurations.ReactiveOAuth2ClientConfiguration matched:
      - @ConditionalOnBean (types: org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; SearchStrategy: all) found bean 'clientRegistrationRepository' (OnBeanCondition)

   ReactiveOAuth2ClientConfigurations.ReactiveOAuth2ClientConfiguration#authorizedClientRepository matched:
      - @ConditionalOnMissingBean (types: org.springframework.security.oauth2.client.web.server.ServerOAuth2AuthorizedClientRepository; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ReactiveOAuth2ClientConfigurations.ReactiveOAuth2ClientConfiguration#authorizedClientService matched:
      - @ConditionalOnMissingBean (types: org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientService; SearchStrategy: all) did not find any beans (OnBeanCondition)
启动spring启动应用程序时:

required a bean of type 'org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository'
============================
CONDITIONS EVALUATION REPORT
============================

Negative matches:
-----------------

   ReactiveOAuth2ClientAutoConfiguration:
      Did not match:
         - NoneNestedConditions 1 matched 0 did not; NestedCondition on ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition.ServletApplicationCondition found 'session' scope (ReactiveOAuth2ClientAutoConfiguration.NonServletApplicationCondition)
      Matched:
         - @ConditionalOnClass found required classes 'reactor.core.publisher.Flux', 'org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity', 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition)

编辑2: 按照建议进行更改后,我现在有以下几点:

@EnableReactiveMethodSecurity
@EnableWebFluxSecurity
public class SecurityConfig {
}
    @Bean
    public ReactiveClientRegistrationRepository reactiveClientRegistrationRepository(OAuth2ClientProperties oAuth2ClientProperties) {
        List<ClientRegistration> clientRegistrations = new ArrayList<>();

        // because autoconfigure does not work for an unknown reason, here the ClientRegistrations are manually configured based on the application.yml
        oAuth2ClientProperties.getRegistration()
                .forEach((k, v) -> {
                    String tokenUri = oAuth2ClientProperties.getProvider().get(k).getTokenUri();
                    ClientRegistration clientRegistration = ClientRegistration
                            .withRegistrationId(k)
                            .tokenUri(tokenUri)
                            .clientId(v.getClientId())
                            .clientSecret(v.getClientSecret())
                            .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
                            .build();
                    clientRegistrations.add(clientRegistration);
                });

        return new InMemoryReactiveClientRegistrationRepository(clientRegistrations);
    }
pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.springframework.security.oauth.boot</groupId>-->
<!--            <artifactId>spring-security-oauth2-autoconfigure</artifactId>-->
<!--        </dependency>-->
        <!--        <dependency>-->
        <!--            <groupId>org.springframework.security.oauth</groupId>-->
        <!--            <artifactId>spring-security-oauth2</artifactId>-->
        <!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-oauth2-client</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.security</groupId>-->
<!--            <artifactId>spring-security-oauth2-core</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.security</groupId>-->
<!--            <artifactId>spring-security-oauth2-jose</artifactId>-->
<!--        </dependency>-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-starter-webflux</artifactId>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

org.springframework.boot
spring-boot-starter-oauth2-client
org.springframework.boot
弹簧启动器webflux
此外,spring项目的所有使用版本:

    <spring-amqp.version>2.2.7.RELEASE</spring-amqp.version>
    <spring-batch.version>4.2.4.RELEASE</spring-batch.version>
    <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
    <spring-data-releasetrain.version>Neumann-SR1</spring-data-releasetrain.version>
    <spring-framework.version>5.2.7.RELEASE</spring-framework.version>
    <spring-hateoas.version>1.1.0.RELEASE</spring-hateoas.version>
    <spring-integration.version>5.3.1.RELEASE</spring-integration.version>
    <spring-kafka.version>2.5.2.RELEASE</spring-kafka.version>
    <spring-ldap.version>2.3.3.RELEASE</spring-ldap.version>
    <spring-restdocs.version>2.0.4.RELEASE</spring-restdocs.version>
    <spring-retry.version>1.2.5.RELEASE</spring-retry.version>
    <spring-security.version>5.3.3.RELEASE</spring-security.version>
    <spring-session-bom.version>Dragonfruit-RELEASE</spring-session-bom.version>
    <spring-ws.version>3.0.9.RELEASE</spring-ws.version>
    <spring.boot.version>2.3.1.RELEASE</spring.boot.version>
    <spring.cloud.version>Hoxton.SR5</spring.cloud.version>
2.2.7.1版本
4.2.4.1发布
2.3.1.1发布
纽曼-SR1
5.2.7.发布
1.1.0.1发布
5.3.1.1发布
2.5.2.1发布
2.3.3.2发布
2.0.4.1发布
1.2.5.1发布
5.3.3.1发布
龙须果释放
3.0.9.1发布
2.3.1.1发布
Hoxton.SR5

问题仍然存在。

更新:

看起来“用户信息身份验证方法”(
userInfoAuthenticationMethod
)是
提供者的部分,而不是
注册的
。请删除双引号

spring:
  security:
    oauth2:
      client:
        registration:
          providerid:
            authorization-grant-type: client_credentials
            client-id: myClientId
            client-secret: mySecret
        provider:
          providerid:
            token-uri: <working token-uri>
            user-info-authentication-method: header

只有这两个依赖项可以完成这项工作:(这些是从Gradle文件中选取的,请将它们更改为POM等效项)

对于测试,您可能需要:

testImplementation 'org.springframework.security:spring-security-test:5.3.3.RELEASE'
您不应将这两者混在一起:

@EnableWebSecurity
@EnableWebFluxSecurity
如果您的应用程序是被动的,那么只需使用
@EnableWebFluxSecurity

关于
@EnableGlobalMethodSecurity(securedEnabled=true)
,本文对此进行了描述,建议删除该选项并改用该选项:

@EnableReactiveMethodSecurity

我仍然对我的解决方案不满意,但我最终做了以下工作:

@EnableReactiveMethodSecurity
@EnableWebFluxSecurity
public class SecurityConfig {
}
    @Bean
    public ReactiveClientRegistrationRepository reactiveClientRegistrationRepository(OAuth2ClientProperties oAuth2ClientProperties) {
        List<ClientRegistration> clientRegistrations = new ArrayList<>();

        // because autoconfigure does not work for an unknown reason, here the ClientRegistrations are manually configured based on the application.yml
        oAuth2ClientProperties.getRegistration()
                .forEach((k, v) -> {
                    String tokenUri = oAuth2ClientProperties.getProvider().get(k).getTokenUri();
                    ClientRegistration clientRegistration = ClientRegistration
                            .withRegistrationId(k)
                            .tokenUri(tokenUri)
                            .clientId(v.getClientId())
                            .clientSecret(v.getClientSecret())
                            .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
                            .build();
                    clientRegistrations.add(clientRegistration);
                });

        return new InMemoryReactiveClientRegistrationRepository(clientRegistrations);
    }
@Bean
公共ReactiveClientRegistrationRepository ReactiveClientRegistrationRepository(OAuth2ClientProperties OAuth2ClientProperties){
List clientRegistrations=new ArrayList();
//由于自动配置因未知原因无法工作,因此此处基于application.yml手动配置ClientRegistration
oAuth2ClientProperties.getRegistration()
.forEach((k,v)->{
字符串tokenUri=oAuth2ClientProperties.getProvider().get(k.getTokenUri();
ClientRegistration ClientRegistration=ClientRegistration
.withRegistrationId(k)
.tokenUri(tokenUri)
.clientId(v.getClientId())
.clientSecret(v.getClientSecret())
.authorizationGrantType(authorizationGrantType.CLIENT\u凭据)
.build();
clientRegistration.add(clientRegistration);
});
返回新的InMemoryReactiveClientRegistrationRepository(clientRegistrations);
}

我使用OAuth的spring属性,然后基于这些属性创建
ReactiveClientRegistrationRepository

如果没有堆栈跟踪,很难提供相关答案

Spring boot似乎无法从属性文件创建
ReactiveClientRegistrationRepository

尝试在客户端上添加提供程序属性

oauth2:
  client:
    registration:
      registrationId:
        provider: providerId
        client-id: clientId
        client-secret: secret
        authorization-grant-type: client_credentials

我遇到了同样的问题,并注意到应用程序创建了一个
ClientRegistrationRepository
,而不是
ReactiveClientRegistrationRepository
。在Spring boot的某个地方添加了
@EnableWebSecurity
(在本例中,我们需要
@EnableWebFluxSecurity

为了解决此问题,我添加了以下属性:

spring.main.web-application-type:reactive

如果还使用
@SpringBootTest
测试应用程序,则还需要在其中添加属性

@SpringBootTest(properties = ["spring.main.web-application-type=reactive]")
或者将web环境设置为
NONE

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)

发生这种情况的原因也在回答中解释:

我删除了所有与oauth2相关的依赖项,现在只使用这三个spring boot starter webflux、spring boot starter security和spring-security-oauth2-client。此外,我删除了
@EnableWebSecurity
注释。问题仍然存在。@marco您是否也删除了
EnableGlobalMethodSecurity
注释?不要使用
spring-bootstarter-security
。安全库将随
spring-security-oauth2-client
提供。如果你的应用程序也是一个资源服务器,那么你需要
spring-boot-starter-oauth2-resource-server
我现在另外做了这两件事,但仍然会得到相同的错误。我还认为我需要org.springframework.security.core.userdetails.userdetails服务no@marco的spring-boot-starter-oauth2-client
包含
spring-security-core
在完成所有这些更改后共享您的代码。如果您认为您的问题变得非常大,请使用github gists或其他工具