Spring OAuth2需要平台TransactionManager
我正在将SpringSecurityOAuth2与JWT令牌集成到SpringBoot项目中。我的身份验证服务器的配置与此中的配置类似 当OAuth2客户端在Spring OAuth2需要平台TransactionManager,spring,spring-security,oauth-2.0,spring-security-oauth2,Spring,Spring Security,Oauth 2.0,Spring Security Oauth2,我正在将SpringSecurityOAuth2与JWT令牌集成到SpringBoot项目中。我的身份验证服务器的配置与此中的配置类似 当OAuth2客户端在/oauth/token上执行POST时,它无法创建访问令牌。记录的具体错误是: o、 s.s.o.provider.endpoint.TokenEndpoint:处理错误:NoSuchBeanDefinitionException,未定义[org.springframework.transaction.PlatformTransacti
/oauth/token
上执行POST时,它无法创建访问令牌。记录的具体错误是:
o、 s.s.o.provider.endpoint.TokenEndpoint:处理错误:NoSuchBeanDefinitionException,未定义[org.springframework.transaction.PlatformTransactionManager]类型的合格bean
在调用tokenServices.createAccessToken
时,我已将其调试到AbstractTokenGranter
第70行。除此之外,我无法轻松调试,因为此调用实际上是通过代理进行的。配置中似乎有什么东西想让它成为事务性的。在JWT中,创建访问令牌不应该是事务性的。我可以理解为什么检索访问代码是事务性的,但是代码成功地通过了这一点
为什么这可能需要
平台TransactionManager
以及我如何提供它?问题是,您在应用程序中配置了一个内存中数据库的用法,使用了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>
com.h2数据库
氢
1.4.187
我遇到了类似的PlatformTransactionManager问题,并通过以下步骤解决了它:
pom.xml
(以便在内存中存储客户端)@EnableAutoConfiguration
注释中的排除类(我之前在排除中添加了DataSourceAutoConfiguration.class
)谢谢。我也有同样的问题 tokenServices.createAccessToken使用@Transactional。 由于我使用mongo DB,所以不需要事务 我通过添加一个伪TransactionManager bean解决了这个问题
@Bean
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new PseudoTransactionManager();
}
问题是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 {
}
};
}
谢谢你的建议,但我没有使用任何SQL数据库。问题:你把注册的客户存储在哪里?再给你一个提示。默认DefaultTokenService的spring内部spring实现用@Transactional注释(第81行)。您需要任何类型的事务管理器。我给你看了两个soloution。在没有事务注释的情况下实现您自己的令牌服务,或者在内存数据库中添加一个作为依赖项的令牌服务。这与提供内存数据库无关。Sprin Oauth InMemory实现使用映射来存储键和值。@FlorianE。我想将权限存储在一个单独的表中,但是
DefaultTokenService
中的getAccessToken
没有用@Transactional
注释。因此,我得到了一个延迟初始化异常,您知道是否有任何理由不代理get方法吗?