记住我功能的基本原理
当用户登录发起认证请求时,会通过UsernamePasswordAuthenticationFilter
进行用户认证,认证成功之后,SpringSecurity 调用前期配置好的记住我功能,实际是调用了RememberMeService
接口,其接口的实现类会将用户的信息生成Token
并将它写入 response 的Cookie
中,在写入的同时,内部的TokenRepositoryTokenRepository
会将这份Token
再存入数据库一份。
当用户再次访问服务器资源的时候,首先会经过RememberMeAuthenticationFiler
过滤器,在这个过滤器里面会读取当前请求中携带的 Cookie,这里存着上次服务器保存 的Token
,然后去数据库中查找是否有相应的 Token,如果有,则再通过UserDetailsService
获取用户的信息。
![](https://i-blog.csdnimg.cn/blog_migrate/1787e01652bb6e1708f52ff9d31666b4.png)
记住我功能的过滤器
从图中可以得知记住我的过滤器在过滤链的中部,注意是在UsernamePasswordAuthenticationFilter
之后。
![](https://i-blog.csdnimg.cn/blog_migrate/ad8bcc4e7363b7076788a316824e5a3f.png)
前端页面checkbox设置
在 html 中增加记住我复选框checkbox控件,注意其中复选框的name
一定必须为remember-me
<input type="checkbox" name="remember-me" value="true"/>
配置cookie存储数据库源
本例中使用了 springboot 管理的数据库源,所以注意要配置spring-boot-starter-jdbc
的依赖:
<dependency>
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
如果不配置会报编译异常:
The type org.springframework.jdbc.core.support.JdbcDaoSupport cannot be resolved. It is indirectly referenced from required .class files
记住我的安全认证配置:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DataSource dataSource;@Overrideprotected void configure(HttpSecurity http) throws Exception {// 将自定义的验证码过滤器放置在 UsernamePasswordAuthenticationFilter 之前http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) .formLogin().loginPage("/login") // 设置登录页面.loginProcessingUrl("/user/login") // 自定义的登录接口.successHandler(myAuthenctiationSuccessHandler).failureHandler(myAuthenctiationFailureHandler).defaultSuccessUrl("/home").permitAll() // 登录成功之后,默认跳转的页