自动登录
n天内免登陆
实现原理
Spring Security的自动登录实现原理:
- 生成一串加密串,作为cookie存入客户浏览器
- 将加密串和其对应的用户信息字符串存入数据库
当用户再次访问时,获取到cookie中的加密串,到数据库中进行比对,如果查询到对应信息,就认证成功自动登录。
第一次登录的时序图:
浏览器->UsernamePasswordAuthenticationFilter: 认证请求
UsernamePasswordAuthenticationFilter->RememberMeService(TokenRepository): 认证成功
RememberMeService(TokenRepository)->浏览器: 将Token写入浏览器Cookie
RememberMeService(TokenRepository)->DB: 将Token写入数据库
第一次登录成功后,后续自动登录时序图:
浏览器->RememberMeAuthenticationFilter: 服务请求
RememberMeAuthenticationFilter->RememberMeService(TokenRepository): 读取Cookie中的Token
RememberMeService(TokenRepository)->DB: 查找Token
RememberMeService(TokenRepository)->UserDetailsService: 自动登录
功能实现
- 创建相关数据库表
建表语句位于
JdbcTokenRepositoryImpl类中,也可以让Spring Security自动创建
create table persistent_logins (username varchar(64) not null,series varchar(64) primary key,token varchar(64) not null,last_used timestamp not null);
- 编写配置类,注入数据源,配置操作数据库对象 ```java @Autowired private DataSource dataSource;
// 将tokenRepository加入Spring容器 @Bean public PersistentTokenRepository persistentTokenRepository() { JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl(); repository.setDataSource(dataSource); // 注入数据源 // repository.setCreateTableOnStartup(true); // 自动创建存储Token的表 return repository; }
3.在自定义的`WebSecurityConfigurerAdapter`子类中,`configure(HttpSecurity http)`方法中加入Token配置```java@Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin() // 自定义登录页面//........// 设置“记住我”.and().rememberMe().tokenRepository(persistentTokenRepository()).tokenValiditySeconds(60) // 设置Token的有效时长.userDetailsService(userDetailsService) // 配置操作数据库的UserDetailsService//........}
- 在登录页面添加”记住我”复选框按钮
<form action="/user/login" method="post"> 用户名:<input type="text" name="username"> <br> 密码:<input type="password" name="password"> <br> <!-- 该name必须为 remember-me, 否则Spring Security不识别 --> <input type="checkbox" name="remember-me" title="记住密码">记住我 <br> <input type="submit" value="login"> </form>
