我正在尝试在我的Web项目中启用“记住我”功能。
这是我正在使用的Spring Security配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/css/**").permitAll()
.antMatchers("/signup").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login").permitAll()
.and()
.logout().permitAll()
.and()
.rememberMe()
;
}
}
在登录页面中,我为此选项添加了一个复选框:
<input type="checkbox" name="remember-me" id="remember-me"/>
当我尝试检查登录时选中“记住我”框时,出现此异常:
java.lang.IllegalStateException: UserDetailsService is required.
我的配置出了什么问题?
注意:我正在使用Spring Boot v2.0.3.RELEASE(Spring Security v5.x)
更新,我尝试遵循this answer建议的解决方案,并解决了通过以下方式更改配置的问题:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ... other configurations...
.rememberMe().userDetailsService(userDetailsService)
;
}
}
但这不能解释为什么以前的配置不起作用。
在RememberMeConfigurer.userDetailsService()
中,javadoc的解释清楚:
默认是使用通过调用AbstractConfiguredSecurityBuilder.getSharedObject(Class)找到的UserDetailsService,该类是在使用WebSecurityConfigurerAdapter.configure(AuthenticationManagerBuilder)时设置的。
而且我的UserDetailsService
实现带有@Component
的注释,因此我希望可以在应用程序上下文中找到它。
那么,出于好奇,有人可以解释一下原始配置的实际问题是什么吗?