3

Я работаю над интеграцией Spring Security OAuth2 с токенами JWT в проект Spring Boot. Мой сервер аутентификации настроен аналогично тому, что находится в этом sample project.Spring OAuth2 Требуется PlatformTransactionManager

Когда клиент OAuth2 выполняет POST на /oauth/token, он не может создать токен доступа. Специфическая ошибка регистрируется в:

o.s.s.o.provider.endpoint.TokenEndpoint : Handling error: NoSuchBeanDefinitionException, No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined

Я отлажена его до AbstractTokenGranter линии 70 при вызове tokenServices.createAccessToken. Я не смог легко отлаживать дальше, потому что этот вызов действительно проходит через прокси. Кажется, что что-то в конфигурации хочет сделать это транзакционным. Создание токенов доступа не должно быть транзакционным в JWT. Я мог понять, почему получение кода доступа будет транзакционным, но код успешно проходит мимо этой точки.

Зачем это может потребоваться PlatformTransactionManager и как я могу его поставить?

ответ

1

Проблема в том, что вы сконфигурировали в своем приложении использование базы данных в памяти с new InMemoryTokenStore(), но ваше приложение для загрузки весной не содержит базы данных в памяти.

Решение: добавьте в свою весеннюю загрузку или зависимость градиента в базе данных в памяти.

Пример H2 и Maven ПОМ:

<dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
     <version>1.4.187</version> 
</dependency> 
+0

Спасибо за предложение, но я не использую любую базу данных SQL. –

+0

Вопрос: Где вы можете хранить своих зарегистрированных клиентов? –

+0

Еще один совет для вас. Реализация внутренней пружинной пружины для стандартного DefaultTokenService аннотируется с помощью @Transactional (строка 81). Чем вам нужен менеджер транзакций. Я вижу два решения для вас. Внедрите свой собственный TokenService без аннотации Transactional или добавьте в базу данных memeory в качестве зависимости. –

0

я столкнулся с аналогичной проблемой в PlatformTransactionManager и решить ее с помощью следующих шагов:

базы данных
  1. Добавлено Н2 pom.xml (Для хранения клиентов память)
  2. Использование Mongo DB в качестве бэкэнда приложения. (Гарантированное приложение использует MongoRepository вместо CrudRepository)
  3. Удалены исключить класс в @EnableAutoConfiguration аннотаций (я ранее добавил DataSourceAutoConfiguration.class в исключении)

Пункт 1 и пункт 3 взаимны. В конфигурации H2 должен быть включен DataSourceAutoConfiguration.class.

Спасибо.

0

У меня была такая же проблема

tokenServices.createAccessToken использовать @Transactional. Как я использую mongo DB, мне не нужны транзакции.

Я решил проблему, добавив компонент PseudoTransactionManager.

@Bean 
public PlatformTransactionManager annotationDrivenTransactionManager() { 
    return new PseudoTransactionManager(); 
} 
1

Проблема в том, что методы в DefaultTokenServices аннотируются с помощью @Transactional. Так что даже если вы не используете базу данных, вам нужно добавить менеджер транзакций боб, как это в конфигурации сервера авторизации:

@Bean 
    public PlatformTransactionManager annotationDrivenTransactionManager() { 
     return new ResourceTransactionManager() { 
      @Override 
      public Object getResourceFactory() { 
       return null; 
      } 

      @Override 
      public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { 
       return null; 
      } 

      @Override 
      public void commit(TransactionStatus status) throws TransactionException { 

      } 

      @Override 
      public void rollback(TransactionStatus status) throws TransactionException { 

      } 
     }; 
    }