前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Security源码分析:Spring Security请记住我

Spring Security源码分析:Spring Security请记住我

作者头像
企鹅号小编
发布2018-02-05 17:08:36
1.2K0
发布2018-02-05 17:08:36
举报
文章被收录于专栏:企鹅号快讯企鹅号快讯

有这样一个场景——有个用户初访并登录了你的网站,然而第二天他又来了,却必须再次登录。于是就有了“记住我”这样的功能来方便用户使用,然而有一件不言自明的事情,那就是这种认证状态的”旷日持久“早已超出了用户原本所需要的使用范围。这意味着,他们可以关闭浏览器,然后再关闭电脑,下周或者下个月,乃至更久以后再回来,只要这间隔时间不要太离谱,该网站总会知道谁是谁,并一如既往的为他们提供所有相同的功能和服务——与许久前他们离开的时候别无二致。

记住我基本原理

.

用户认证成功之后调用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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档