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

本文来自企鹅号 - java交流学习媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

Linux常用Shell脚本知多少

在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运...

1121
来自专栏互扯程序

Linux常用Shell脚本,值得学习及收藏

在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运...

1591
来自专栏Timhbw博客

学习提升之HTTP状态码详解

2016-11-1410:23:53 发表评论 315℃热度 1.URL 2.URL中常见的协议 3.TCP/IP协议簇 4.TCP/IP参考模型 ...

3466
来自专栏bboysoul

linux编译安装mysql5.7

wget mirrors.sohu.com/mysql/MySQL-5.7/mysql-boost-5.7.17.tar.gz 因为官方下载地址速度太慢了,所...

1383
来自专栏小白安全

Burpsuite插件的使用

Burp插件的使用 使用准备 Burpsuite可以使用三种语言编写的扩展插件,Java、Python和Ruby。除Java外,其它两种需要的扩展...

2974
来自专栏白驹过隙

Socket编程回顾,一个最简单服务器程序

2183
来自专栏菩提树下的杨过

Spring Security笔记:Remember Me(下次自动登录)

前一节学习了如何限制登录尝试次数,今天在这个基础上再增加一点新功能:Remember Me. 很多网站,比如博客园,在登录页面就有这个选项,勾选“下次自动登录”...

4086
来自专栏FreeBuf

微软 Edge 浏览器爆高危漏洞,受控电脑可执行任意命令

10月12日,有安全研究人员发布了Windows Shell REC( CVE-2018-8495))漏洞概念验证代码,受影响软件为Windows 10内置的M...

1022
来自专栏软件

经验分享 Burpsuite插件的使用

Burp插件的使用 使用准备 Burpsuite可以使用三种语言编写的扩展插件,Java、Python和Ruby。除Java外,其它两种需要的扩展插件需要配置运...

4337
来自专栏逸鹏说道

使用OAuth打造webapi认证服务供自己的客户端使用(二)

在上一篇”使用OAuth打造webapi认证服务供自己的客户端使用“的文章中我们实现了一个采用了OAuth流程3-密码模式(resource owner pas...

3589

扫码关注云+社区

领取腾讯云代金券