Spring Security RememberMe
2018-09-24 本文已影响44人
司鑫
基本原理
rememberMe 流程
- 当用户首次发送 login request 时, 会先经过
UsernamePasswordAuthenticationFilter
进行校验,校验通过后会自动调用RememberMeService
将 Token 保存进数据库,同时将 Token 返回写入到浏览器 cookie 中 - 在token未失效再次登录时,request中携带有token发送request时会直接读取到对应的token和username,然后根据username获取到用户的信息
当 UsernamePasswordAuthentication
and BasicAthenticationFilter
无法校验时,RememberMeAuthenticationFilter
会进行校验请求中是否携带有 token,并进行下一步操作。
实现
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private DataSource dataSource;
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.rememberMe()
.tokenRepository(persistentTokenRepository()) // 获取token
.tokenValiditySeconds(3600)//token有效期
.userDetailsService(customUserDetailsService); // 根据token拿到username后,从哪获取到用户信息
}
@Bean
public PersistentTokenRepository persistentTokenRepository() {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
tokenRepository.setCreateTableOnStartup(true);//在启动时,自动创建 token 表,或者自行执行SQL语句(create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, "
+ "token varchar(64) not null, last_used timestamp not null)
return tokenRepository;
}
}