有这样一个场景——有个用户初访并登录了你的网站,然而第二天他又来了,却必须再次登录。于是就有了“记住我”这样的功能来方便用户使用,然而有一件不言自明的事情,那就是这种认证状态的”旷日持久“早已超出了用户原本所需要的使用范围。这意味着,他们可以关闭浏览器,然后再关闭电脑,下周或者下个月,乃至更久以后再回来,只要这间隔时间不要太离谱,该网站总会知道谁是谁,并一如既往的为他们提供所有相同的功能和服务——与许久前他们离开的时候别无二致。
记住我基本原理
.
用户认证成功之后调用RemeberMeService根据用户名名生成Token由TokenRepository写入到数据库,同时也将Token写入到浏览器的Cookie中
重启服务之后,用户再次登入系统会由RememberMeAuthenticationFilter拦截,从Cookie中读取Token信息,与persistent_logins
表匹配判断是否使用记住我功能。最中由UserDetailsService查询用户信息
.
记住我实现
创建persistent_logins表
create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, token varchar(64) not null, last_used timestamp not null);
登陆页面添加记住我复选款(name必须是remeber-me)
下次自动登录
配置MerryyouSecurityConfig
http. ...... .and() .rememberMe() .tokenRepository(persistentTokenRepository())//设置操作表的Repository .tokenValiditySeconds(securityProperties.getRememberMeSeconds())//设置记住我的时间 .userDetailsService(userDetailsService)//设置userDetailsService .and() ......
源码分析
首次登录
AbstractAuthenticationProcessingFilter#successfulAuthentication
.
.将已认证过的Authentication放入到SecurityContext中
登录成功调用rememberMeServices
AbstractRememberMeServices#loginSuccess
.
判断是否勾选记住我
PersistentTokenBasedRememberMeServices#onLoginSuccess
.
获取用户名
创建Token
存储都数据库
写入到浏览器的Cookie中
二次登录Remember-me
RememberMeAuthenticationFilter#doFilter
.
判断SecurityContext中没有Authentication
从Cookie查询用户信息返回RememberMeAuthenticationToken
如果不为空则由authenticationManager认证
AbstractRememberMeServices#autoLogin
获取Cookie
解析Cookie
获取用户凭证
检查用户凭证
作者:dandandeshangni
本文来自企鹅号 - java交流学习媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - java交流学习媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。