springsecurity 记住我
原理分析
1、用户登录通过UsernamePasswordAuthenticationFilter认证请求处理,
2、通过RememberMeServices对象中的onLoginSuccess方法完成登录成功后的处理,
2.1、TokenRepository对象生成token字符
2.2、RememberMeServices对象的addCookie方法将生成的token字符串存储到Cookie中
2.3、token字符串存储到数据库中
3、用户再次访问
4、RememberMeAuthenticationFilter过滤器中读取Cookie中的Token字符串
5、判断读取的Token字符串和数据库中的存储数据是否一致,并且返回UserDetailsService
用法
cookie读写RememberMeAuthenticationFilter过滤器已经完成,现在就缺少数据库存储,数据库相关的就需要配置数据源
1、创建表
CREATE TABLE persistent_logins (username VARCHAR(64) NOT NULL, series VARCHAR(64) PRIMARY KEY, token VARCHAR(64) NOT NULL, last_used TIMESTAMP NOT NULL)
2、配置操作数据库表,在SecurityConfig配置类
@Autowired DataSource dataSource; public PersistentTokenRepository persistentTokenRepository(){ JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl(); jdbcTokenRepository.setDataSource(dataSource); //jdbcTokenRepository.setCreateTableOnStartup(true); //自动创建token相关数据表 return jdbcTokenRepository; }
3、配置记住我
//授权:针对url的设置 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated(). and(). formLogin() .and() .rememberMe() .tokenRepository(persistentTokenRepository()) .tokenValiditySeconds(60)//设置有效时长,单位:秒 .userDetailsService(userDetailsServiceImpl)
.and() .csrf().disable(); }
4、画面设计
注意:自定义登录页面时【记住我】的组件name属性值是remember-me,通过rememberMeParameter修改默认值
<input type="checkbox" name="remember-me"/>