当前位置: 移动技术网 > IT编程>开发语言>Java > SpringBootSecurity学习(10)网页版登录之记住我功能

SpringBootSecurity学习(10)网页版登录之记住我功能

2019年10月01日  | 移动技术网IT编程  | 我要评论
场景 很多登录都有记住我这个功能,在用户登陆一次以后,系统会记住用户一段时间,在这段时间,用户不用反复登陆就可以使用我们的系统。记住用户功能的基本原理如下图: 用户登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFilter,当该过滤器认证成功后,会调用Rem ...

场景

很多登录都有记住我这个功能,在用户登陆一次以后,系统会记住用户一段时间,在这段时间,用户不用反复登陆就可以使用我们的系统。记住用户功能的基本原理如下图:

file

用户登录的时候,请求发送给过滤器usernamepasswordauthenticationfilter,当该过滤器认证成功后,会调用remembermeservice,会生成一个token,将token写入到浏览器cookie,同时remembermeservice里边还有个tokenrepository,将token和用户信息写入到数据库中。这样当用户再次访问系统,访问某一个接口时,会经过一个remembermeauthenticationfilter的过滤器,他会读取cookie中的token,交给rememberservice,rememberservice会用tokenrepository根据token从数据库中查是否有记录,如果有记录会把用户名取出来,再调用userdetailservice根据用户名获取用户信息,然后放在securitycontext里。

实现类

首先来实现操作token的类,实现增删改查功能,我们来使用redis保存,新建类remembermehandler,这个类需要实现接口 persistenttokenrepository,首先来全局看一下类结构:

file

为了方便查询,我们在记住一个用户的时候,向redis中保存三条数据,其中两个是根据series查用户名和根据用户名查series。token定义的保存时长为15天,这两个定为30天。最下面的三个方法就是保存这两个key的方法和生成所有key的方法。四个重写的方法就是增删改查方法。首先来看新增:

file

需要记住用户的时候,把用户的信息组合在一起,添加到redis中,并定义15天的过期时间。然后看修改和删除:

file

都是对保存内容的正常操作,最后看查询:

file

记住用户之后,用户登录,查询出用户信息,实现自动认证。

网上有很多使用jdbc实现的方式,也是一种不错的选择。

配置记住我

在security配置类中,需要配置记住我的参数名字和处理类:

file

注意这里的授权配置要使用 authenticated() 。登录页面中增加记住我:

file

注意这里的参数名字 remember-me 是security记住我的默认名字。

测试

不勾选记住我,点击登录,redis中并没有记录token信息,勾选记住我,点击登录,可以看到记住我的信息记录在redis中:

file

我们启动项目,登录成功并勾选记住用户,然后重新启动项目,在同一个浏览器中访问页面,可以看到不用登录直接可以成功!

代码地址: 10

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网