spring security使用篇 记住我功能原理以及实现
2018-10-13 本文已影响132人
怪诞140819
1.原理解析
1.1 记住我基本原理
记住我基本功能原理- 客户端发送请求认证
- UsernamePasswordAuthenticationFilter认证成功后调用RemeberMeService生成token
- TokenRepository将token存入数据库
- RemeberMeService将token写入浏览器cookie
- 服务再次请求的时候,RemeberMeAuthencationFilter读取到cookie中的token
- 根据token到数据库查找,如果查找到,然后拿到username,然后再通过UserDetailsService获取到用户信息,存入session中。
1.2 RemeberMeAuthencationFilter
image.png- RemeberMeAuthencationFilter位置相对靠后,当其他的过滤器没有进行认证成功,RemeberMe回去尝试进行认证
2.实现
2.1 注入一个PersistentTokenRepository
的Bean
对于注释的创建表的代码可以在第一次执行完后进行注释,也可以跟到代码拿到从建表语句,自己创建,然后不需要这行代码
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
//tokenRepository.setCreateTableOnStartup(true);
return tokenRepository;
}
2.2 HttpSecurity配置
http.anyRequest()
.authenticated()
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(securityProperties.getBrowser().getTokenValiditySeconds())
.userDetailsService(userDetailsService)
-
tokenRepository(persistentTokenRepository())
配置tokenRepository -
.tokenValiditySeconds(securityProperties.getBrowser().getTokenValiditySeconds())
配置token的过期时间 -
.userDetailsService(userDetailsService)
配置userDetailsService因为记住我的功能需要根据token获取username,然后userDetailsService根据username去获取到用户的数据
2.3 html中的处理
<input name="remember-me" type="checkbox" value="true" />记住我
- 这里做的是表单提交,其他做响应的处理。但是参数的name值必须是remember-me,value为true或者fasle