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

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

记住我基本原理

.

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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180118A0S6V400?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区