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
相关产品推荐
相关产品推荐

