Spring Security Oauth2 Client ReactiveClientRegistrationRepository с использованием Spring Boot 3.2? ⇐ JAVA
-
Anonymous
Spring Security Oauth2 Client ReactiveClientRegistrationRepository с использованием Spring Boot 3.2?
Какова правильная конфигурация клиента Spring Security Oauth2 при использовании Spring Boot 3.2.1?
У меня есть работающее реактивное приложение Spring Boot 3.1.6, которое использует клиент Spring Security Oauth2 при аутентификации запросов к стороннему серверу. Когда я пытаюсь выполнить обновление до Spring Boot 3.2.1, приложение не запускается из-за NoSuchBeanDefinitionException: отсутствует соответствующий bean-компонент типа «org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository». Глядя на исходный код класса ReactiveOAuth2ClientConfigurations, мне кажется, что такой bean-компонент должен создаваться автоматически Spring Boot:
@Conditional(ClientsConfiguredCondition.class) @ConditionalOnMissingBean(ReactiveClientRegistrationRepository.class) статический класс ReactiveClientRegistrationRepositoryConfiguration { @Бин InMemoryReactiveClientRegistrationRepository clientRegistrationRepository (свойства OAuth2ClientProperties) { Регистрации List = новый ArrayList( новый OAuth2ClientPropertiesMapper(properties).asClientRegistrations().values()); вернуть новый InMemoryReactiveClientRegistrationRepository(регистрации); } } Более того, в примечаниях к выпуску Spring Boot 3.2 я нашел запись о зависимости spring-security-oauth2-client (которую я использую), но в ней не упоминается ReactiveClientRegistrationRepository< /код>.
Как я могу решить эту проблему?
Это ApplicationConfiguration:
@Configuration @ComponentScan(basePackages = "com.example.application") @EnableAutoConfiguration @EnableConfigurationProperties(ApplicationProperties.class) общественный класс ApplicationConfiguration { /** * Это соответствует записи идентификатора клиента в {@code Spring.security.oauth2.client.registration} в {@code application.yml}. */ частная статическая окончательная строка OAUTH_CLIENT_REGISTRATION = «тест»; /** * Это {@link WebClient}, который будет использоваться для отправки исходящего запроса в ATT. * Он настроен на предоставление токена носителя OAuth2 для запроса. */ @Бин WebClient attHttpClient( конструктор WebClient.Builder, ReactiveOAuth2AuthorizedClientManager авторизованныйClientManager, ApplicationProperties applicationProperties) { ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client = новый ServerOAuth2AuthorizedClientExchangeFilterFunction (authorizedClientManager); oauth2Client.setDefaultClientRegistrationId(OAUTH_CLIENT_REGISTRATION); вернуть builder.filter(oauth2Client) .baseUrl(applicationProperties.getBaseUrl()) .строить(); } /** * Это {@link ReactiveOAuth2AuthorizedClientManager}, который будет использоваться для получения токена носителя OAuth2. */ @Бин public ReactiveOAuth2AuthorizedClientManager AuthorizedClientManager( ReactiveClientRegistrationRepository clientRegistrationRepository, ReactiveOAuth2AuthorizedClientService AuthorizedClientService) { ReactiveOAuth2AuthorizedClientProvider AuthorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder.builder() .clientCredentials() .строить(); // Мы не можем использовать DefaultReactiveOAuth2AuthorizedClientManager, поскольку мы не находимся в веб-контексте, поскольку // аутентификация необходима для обработки сообщений, полученных из RabbitMQ (а не из веб-запросов) AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager AuthorizedClientManager = новый AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager( clientRegistrationRepository, авторизованныйClientService); авторизованныйClientManager.setAuthorizedClientProvider(authorizedClientProvider); вернуть авторизованныйClientManager; } } и соответствующие части из application.yaml:
spring: безопасность: оаут2: клиент: Регистрация: тест: тип предоставления-авторизации: client_credentials идентификатор клиента: ${client-id} секрет клиента: ${client-secret} область действия: api://${app-id}/.default поставщик: тест: # Это URI конечной точки токена OAuth2. токен-uri: https://login.microsoftonline.com/${aad ... v2.0/token При обновлении до Spring Boot 3.2.1 я столкнулся со следующим исключением:
java.lang.IllegalStateException: не удалось загрузить ApplicationContext [...] Вызвано: org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка создания bean-компонента с именем «authorizedClientManager», определенным в ресурсе пути к классу [com/example/ApplicationConfiguration.class]: неудовлетворенная зависимость, выраженная через параметр метода «authorizedClientManager» 0: нет подходящего bean-компонента типа «org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository» доступен: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат для автоматического подключения. Аннотации зависимостей: {} в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802) в org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1166) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) в org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1441) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) в org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911) в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ... еще 93 Вызвано: org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего bean-компонента типа «org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository»: ожидается как минимум один bean-компонент, который квалифицируется как кандидат для автоматического подключения. Аннотации зависимостей: {} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878) в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) в org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911) в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ... еще 107
Какова правильная конфигурация клиента Spring Security Oauth2 при использовании Spring Boot 3.2.1?
У меня есть работающее реактивное приложение Spring Boot 3.1.6, которое использует клиент Spring Security Oauth2 при аутентификации запросов к стороннему серверу. Когда я пытаюсь выполнить обновление до Spring Boot 3.2.1, приложение не запускается из-за NoSuchBeanDefinitionException: отсутствует соответствующий bean-компонент типа «org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository». Глядя на исходный код класса ReactiveOAuth2ClientConfigurations, мне кажется, что такой bean-компонент должен создаваться автоматически Spring Boot:
@Conditional(ClientsConfiguredCondition.class) @ConditionalOnMissingBean(ReactiveClientRegistrationRepository.class) статический класс ReactiveClientRegistrationRepositoryConfiguration { @Бин InMemoryReactiveClientRegistrationRepository clientRegistrationRepository (свойства OAuth2ClientProperties) { Регистрации List = новый ArrayList( новый OAuth2ClientPropertiesMapper(properties).asClientRegistrations().values()); вернуть новый InMemoryReactiveClientRegistrationRepository(регистрации); } } Более того, в примечаниях к выпуску Spring Boot 3.2 я нашел запись о зависимости spring-security-oauth2-client (которую я использую), но в ней не упоминается ReactiveClientRegistrationRepository< /код>.
Как я могу решить эту проблему?
Это ApplicationConfiguration:
@Configuration @ComponentScan(basePackages = "com.example.application") @EnableAutoConfiguration @EnableConfigurationProperties(ApplicationProperties.class) общественный класс ApplicationConfiguration { /** * Это соответствует записи идентификатора клиента в {@code Spring.security.oauth2.client.registration} в {@code application.yml}. */ частная статическая окончательная строка OAUTH_CLIENT_REGISTRATION = «тест»; /** * Это {@link WebClient}, который будет использоваться для отправки исходящего запроса в ATT. * Он настроен на предоставление токена носителя OAuth2 для запроса. */ @Бин WebClient attHttpClient( конструктор WebClient.Builder, ReactiveOAuth2AuthorizedClientManager авторизованныйClientManager, ApplicationProperties applicationProperties) { ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2Client = новый ServerOAuth2AuthorizedClientExchangeFilterFunction (authorizedClientManager); oauth2Client.setDefaultClientRegistrationId(OAUTH_CLIENT_REGISTRATION); вернуть builder.filter(oauth2Client) .baseUrl(applicationProperties.getBaseUrl()) .строить(); } /** * Это {@link ReactiveOAuth2AuthorizedClientManager}, который будет использоваться для получения токена носителя OAuth2. */ @Бин public ReactiveOAuth2AuthorizedClientManager AuthorizedClientManager( ReactiveClientRegistrationRepository clientRegistrationRepository, ReactiveOAuth2AuthorizedClientService AuthorizedClientService) { ReactiveOAuth2AuthorizedClientProvider AuthorizedClientProvider = ReactiveOAuth2AuthorizedClientProviderBuilder.builder() .clientCredentials() .строить(); // Мы не можем использовать DefaultReactiveOAuth2AuthorizedClientManager, поскольку мы не находимся в веб-контексте, поскольку // аутентификация необходима для обработки сообщений, полученных из RabbitMQ (а не из веб-запросов) AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager AuthorizedClientManager = новый AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager( clientRegistrationRepository, авторизованныйClientService); авторизованныйClientManager.setAuthorizedClientProvider(authorizedClientProvider); вернуть авторизованныйClientManager; } } и соответствующие части из application.yaml:
spring: безопасность: оаут2: клиент: Регистрация: тест: тип предоставления-авторизации: client_credentials идентификатор клиента: ${client-id} секрет клиента: ${client-secret} область действия: api://${app-id}/.default поставщик: тест: # Это URI конечной точки токена OAuth2. токен-uri: https://login.microsoftonline.com/${aad ... v2.0/token При обновлении до Spring Boot 3.2.1 я столкнулся со следующим исключением:
java.lang.IllegalStateException: не удалось загрузить ApplicationContext [...] Вызвано: org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка создания bean-компонента с именем «authorizedClientManager», определенным в ресурсе пути к классу [com/example/ApplicationConfiguration.class]: неудовлетворенная зависимость, выраженная через параметр метода «authorizedClientManager» 0: нет подходящего bean-компонента типа «org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository» доступен: ожидается как минимум 1 bean-компонент, который квалифицируется как кандидат для автоматического подключения. Аннотации зависимостей: {} в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802) в org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:546) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1166) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) в org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) в org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) в org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) в org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1441) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) в org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911) в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ... еще 93 Вызвано: org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного квалифицирующего bean-компонента типа «org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository»: ожидается как минимум один bean-компонент, который квалифицируется как кандидат для автоматического подключения. Аннотации зависимостей: {} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878) в org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404) в org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) в org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911) в org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ... еще 107
Мобильная версия