SpringBootSecurity学习(10)网页版登录之记住我功能
Posted guos
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBootSecurity学习(10)网页版登录之记住我功能相关的知识,希望对你有一定的参考价值。
场景
很多登录都有记住我这个功能,在用户登陆一次以后,系统会记住用户一段时间,在这段时间,用户不用反复登陆就可以使用我们的系统。记住用户功能的基本原理如下图:
用户登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用RememberMeService,会生成一个token,将token写入到浏览器cookie,同时RememberMeService里边还有个TokenRepository,将token和用户信息写入到数据库中。这样当用户再次访问系统,访问某一个接口时,会经过一个RememberMeAuthenticationFilter的过滤器,他会读取cookie中的token,交给RememberService,RememberService会用TokenRepository根据token从数据库中查是否有记录,如果有记录会把用户名取出来,再调用UserDetailService根据用户名获取用户信息,然后放在SecurityContext里。
实现类
首先来实现操作token的类,实现增删改查功能,我们来使用redis保存,新建类RememberMeHandler,这个类需要实现接口 PersistentTokenRepository,首先来全局看一下类结构:
为了方便查询,我们在记住一个用户的时候,向redis中保存三条数据,其中两个是根据series查用户名和根据用户名查series。token定义的保存时长为15天,这两个定为30天。最下面的三个方法就是保存这两个key的方法和生成所有key的方法。四个重写的方法就是增删改查方法。首先来看新增:
需要记住用户的时候,把用户的信息组合在一起,添加到redis中,并定义15天的过期时间。然后看修改和删除:
都是对保存内容的正常操作,最后看查询:
记住用户之后,用户登录,查询出用户信息,实现自动认证。
网上有很多使用jdbc实现的方式,也是一种不错的选择。
配置记住我
在security配置类中,需要配置记住我的参数名字和处理类:
注意这里的授权配置要使用 authenticated() 。登录页面中增加记住我:
注意这里的参数名字 remember-me 是security记住我的默认名字。
测试
不勾选记住我,点击登录,redis中并没有记录token信息,勾选记住我,点击登录,可以看到记住我的信息记录在redis中:
我们启动项目,登录成功并勾选记住用户,然后重新启动项目,在同一个浏览器中访问页面,可以看到不用登录直接可以成功!
代码地址:https://gitee.com/blueses/spring-boot-security 10
以上是关于SpringBootSecurity学习(10)网页版登录之记住我功能的主要内容,如果未能解决你的问题,请参考以下文章
SpringBootSecurity学习(09)网页版登录配置Session共享
SpringBootSecurity学习(07)网页版登录整合JDBC
SpringBootSecurity学习(08)网页版登录整合MyBatis
SpringBootSecurity学习(04)网页版登录其它授权和登录处理