Spring Security 6中JdbcTokenStore的替代方案咨询(OAuth2迁移)
Spring Security 6 替代 JdbcTokenStore 的方案
Spring Security 6 移除了旧版 OAuth2 模块中的 JdbcTokenStore,因为官方已将 OAuth2 授权服务器的核心功能迁移至 Spring Authorization Server 项目。要保留原有基于 JDBC 的令牌存储逻辑、且行为与 JdbcTokenStore 一致,可以按照以下方案实现:
1. 引入 Spring Authorization Server 依赖
首先需要添加官方授权服务器的依赖,以 Maven 为例:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-authorization-server</artifactId> <version>1.1.0</version> <!-- 版本需与 Spring Security 6.0.x 匹配 --> </dependency>
2. 配置 JDBC 令牌存储组件
Spring Authorization Server 提供了 JdbcOAuth2AuthorizationService 和 JdbcOAuth2AuthorizationConsentService,这两个组件基于 JDBC 存储授权信息与令牌,是 JdbcTokenStore 的官方替代方案。
核心 Bean 配置
// 客户端信息存储(兼容原有 OAuth2 客户端配置) @Bean public RegisteredClientRepository registeredClientRepository(JdbcOperations jdbcOperations) { return new JdbcRegisteredClientRepository(jdbcOperations); } // 授权与令牌存储核心服务 @Bean public OAuth2AuthorizationService authorizationService(JdbcOperations jdbcOperations, RegisteredClientRepository registeredClientRepository) { // 默认映射器,可自定义适配旧表结构 OAuth2AuthorizationRowMapper rowMapper = new OAuth2AuthorizationRowMapper(registeredClientRepository); return new JdbcOAuth2AuthorizationService(jdbcOperations, rowMapper); } // 授权同意信息存储 @Bean public OAuth2AuthorizationConsentService authorizationConsentService(JdbcOperations jdbcOperations, RegisteredClientRepository registeredClientRepository) { return new JdbcOAuth2AuthorizationConsentService(jdbcOperations, registeredClientRepository); }
3. 整合授权服务器配置
将上述存储组件注入授权服务器的安全过滤链,确保授权流程使用 JDBC 存储令牌:
@Bean public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { // 应用授权服务器默认安全配置 OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); // 注入自定义的授权存储服务 OAuth2AuthorizationServerConfigurer configurer = http.getConfigurer(OAuth2AuthorizationServerConfigurer.class); configurer.authorizationService(authorizationService(jdbcOperations(), registeredClientRepository(jdbcOperations()))) .authorizationConsentService(authorizationConsentService(jdbcOperations(), registeredClientRepository(jdbcOperations()))); // 可选:如果需要资源服务器支持,配置JWT或令牌解析逻辑 http.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); return http.build(); }
4. 兼容原有数据库表结构(可选)
默认情况下,JdbcOAuth2AuthorizationService 使用官方新表结构(如 oauth2_authorization、oauth2_authorization_consent)。如果需要完全复用旧版 JdbcTokenStore 的表(如 oauth_access_token、oauth_refresh_token),可以:
- 自定义
OAuth2AuthorizationRowMapper,实现旧表字段到OAuth2Authorization对象的映射 - 或者编写自定义的
OAuth2AuthorizationService实现类,直接操作旧表数据
内容的提问来源于stack exchange,提问作者SEJAL MIRANI
相关产品推荐
相关产品推荐

