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

Autowire当前RememberMeServices失败,如何获取默认实例?

解决Spring Security中RememberMeServices无法Autowired注入的问题

这个问题的核心原因很明确:你通过HttpSecurity.rememberMe()配置的RememberMeServices实例,默认并不会被注册为Spring容器中的Bean——它只是Spring Security内部Filter链使用的组件,并没有被发布到ApplicationContext里,所以Autowired自然找不到对应的Bean定义。

下面给你两种可行的解决办法,优先推荐第一种:

方法1:手动将RememberMeServices注册为Spring Bean

你可以在配置类中显式定义一个@Bean方法来创建RememberMeServices实例,这样Spring就会把它纳入容器管理,Autowired就能正常注入了。

步骤1:定义RememberMeServices的Bean

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private PersistentTokenRepository myTokenRepository;

    // 定义RememberMeServices Bean
    @Bean
    public RememberMeServices rememberMeServices() {
        // 使用PersistentTokenBasedRememberMeServices(对应你配置的tokenRepository)
        PersistentTokenBasedRememberMeServices services = 
            new PersistentTokenBasedRememberMeServices(
                "your-application-secret-key", // 自定义的密钥,用于签名remember-me cookie
                userDetailsService, 
                myTokenRepository
            );
        // 可选:设置cookie的名称、过期时间等属性
        services.setCookieName("remember-me-cookie");
        services.setTokenValiditySeconds(86400 * 7); // 7天有效期
        return services;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.rememberMe()
            // 引用我们刚才定义的Bean,替代默认的自动创建逻辑
            .rememberMeServices(rememberMeServices());
        // 注意:这里不需要再调用tokenRepository()了,因为已经在Bean里配置过了
    }
}

步骤2:正常注入使用

现在你的AuthConfig里的Autowired就能正常工作了:

public class AuthConfig {
    @Autowired
    private RememberMeServices rememberMeServices;

    // 后续可以正常使用这个实例
}

方法2:通过SecurityContext获取(不推荐,仅作补充)

如果不想手动注册Bean,也可以在需要使用的地方通过SecurityContext间接获取,但这种方式不够优雅,且依赖当前请求上下文:

public class AuthConfig {
    public void someMethod() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        // Spring Security会将RememberMeServices实例存在request的指定属性中
        RememberMeServices services = (RememberMeServices) request.getAttribute("SPRING_SECURITY_REMEMBER_ME_SERVICES");
        // 使用services...
    }
}

显然第一种方法更符合Spring的依赖注入规范,也更易于维护,建议优先采用。

内容的提问来源于stack exchange,提问作者s1moner3d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:46:42