Spring Security 6/Spring Boot 3.1持久化Token记住我服务实现问题
解决Spring Security 6持久化Remember-Me的空指针问题
问题根源
你遇到的NullPointerException核心原因是:手动实例化的JdbcTokenRepositoryImpl没有绑定数据源,导致内部的JdbcTemplate未初始化,无法执行数据库操作生成Token。虽然Spring Boot已经自动配置了全局数据源,但手动new出的实例不会自动注入依赖,必须显式设置。
解决方案
1. 注入全局数据源
在你的SecurityConfig类中添加DataSource的自动注入:
@Configuration @EnableWebSecurity(debug = true) @EnableMethodSecurity public class SecurityConfig { @Autowired private MuserDetailsService muserDetailsService; @Autowired private DataSource dataSource; // 新增全局数据源注入 // ... 其他代码不变 }
2. 为JdbcTokenRepositoryImpl绑定数据源
修改getRememberMeServices方法,为JdbcTokenRepositoryImpl设置数据源:
@Bean public RememberMeServices getRememberMeServices() { JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); // 关键:绑定全局数据源 PersistentTokenBasedRememberMeServices rememberMeServices = new PersistentTokenBasedRememberMeServices( rememberMeKey, muserDetailsService, jdbcTokenRepository ); // 可选:如果前端传入的remember-me参数名不是默认的"remember-me",设置自定义名称 // rememberMeServices.setParameterName("rememberMe"); return rememberMeServices; }
3. 验证自定义过滤器的参数处理
你的自定义MyUsernamePasswordAuthenticationFilter已设置rememberMeServices,需确保登录请求中包含remember-me参数(默认名称)且值为true。若前端使用其他参数名,需在PersistentTokenBasedRememberMeServices中通过setParameterName指定。
额外说明
- 无需单独创建数据源:Spring Boot自动配置的数据源可被所有组件共享,你的自定义DAO能正常使用
JdbcTemplate已证明数据源配置有效。 JdbcTokenRepositoryImpl虽无接收数据源的构造方法,但提供了setDataSource方法绑定,内部会自动生成对应的JdbcTemplate实例。
完成以上修改后,重启应用并携带remember-me=true参数登录,即可正常生成并持久化Token到persistent_logins表。
内容的提问来源于stack exchange,提问作者theMyth
相关产品推荐
相关产品推荐

