Spring OAuth2需要PlatformTransactionManager

时间:2015-07-01 20:50:16

标签: spring spring-security oauth-2.0 spring-security-oauth2

我正致力于将Spring Security OAuth2与JWT令牌集成到Spring Boot项目中。我的身份验证服务器的配置与此sample project中的配置类似。

当OAuth2客户端在/oauth/token上执行POST时,无法创建访问令牌。记录的具体错误是:

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

我在调用AbstractTokenGranter时将其调整到tokenServices.createAccessToken第70行。由于此调用实际上是通过代理进行的,因此我无法轻松调试。似乎配置中的某些东西想要进行此事务。创建访问令牌在JWT中不应该是事务性的。我可以看到为什么检索访问代码是事务性的,但代码成功地超过了那一点。

为什么这可能需要PlatformTransactionManager,我该如何提供?

4 个答案:

答案 0 :(得分:2)

问题是您在应用程序中配置了使用new InMemoryTokenStore()的内存数据库,但是您的spring-boot应用程序不包含内存数据库。

解决方案:在内存数据库中添加spring-boot pom或gradle依赖项。

H2和Maven pom的例子:

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

答案 1 :(得分:1)

我遇到了同样的问题

tokenServices.createAccessToken使用@Transactional。 因为我使用mongo DB我不需要交易。

我通过添加PseudoTransactionManager bean解决了这个问题。

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

答案 2 :(得分:1)

问题是DefaultTokenServices中的方法是用@Transactional注释的。因此,即使您没有使用数据库,也需要在授权服务器配置中添加这样的事务管理器bean:

    @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 {

            }
        };
    }

答案 3 :(得分:0)

我遇到了类似的PlatformTransactionManager问题,并通过以下步骤解决了这个问题:

  1. 将H2数据库添加到pom.xml(以便在内存中存储客户端)
  2. 使用Mongo DB作为应用程序后端。 (确保应用程序使用MongoRepository而不是CrudRepository)
  3. 删除了@EnableAutoConfiguration注释中的排除类(我之前添加的DataSourceAutoConfiguration.class已被排除)
  4. 第1点和第3点是相互的。 H2配置应启用DataSourceAutoConfiguration.class。

    感谢。