You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:36:02