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

原文地址:https://www.cnblogs.com/guos/p/11615448.html

时间: 2024-07-30 02:19:19

SpringBootSecurity学习(10)网页版登录之记住我功能的相关文章

SpringBootSecurity学习(01)网页版登录入门介绍

Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.权限管理的设计一般使用角色来管理,即给一个用户赋予哪些角色,这个用户就具有哪些权限. Spring框架体系中,经典的安全体系框架是Security.关于系统的安全管理及各种设计,Spring Security已经大体上都实现了,只需要一些配置和引用就能够正常使用.SpringBoot使用Security更加的简单,因为Spr

SpringBootSecurity学习(04)网页版登录其它授权和登录处理

其它授权配置 security的配置类中,对所有路径进行了统一授权配置.但是有的内容我们也需要让未登录游客有权限访问,比如js,css等静态文件,还有一些宣传页面等等.这些路径可以单独配置: 我们来试验一些,springboot项目的试图页面一般放在resource文件夹下面的templates文件夹下.而静态文件一般放在resource文件夹下面的static文件夹下.我们来建立一个test.css文件, 随便写点内容,启动项目看看效果: 可以看到在未登录的情况下是可以访问的.也可以弄一个简单

SpringBootSecurity学习(07)网页版登录整合JDBC

数据库中定义用户 前面我们定义用户是在配置文件和代码中定义死的默认用户,一般在开发中是不会这样做的,我们的用户都是来自我们的用户表,存储在数据库中.操作数据库的技术有很多,spring security默认支持了一个JDBC的方式,下面用这个方式来从数据库中查询用户.首先定义用户表users: enabled字段表示是否启用,改为0表示不允许此用户登录.在表里面添加两个用户 : 注意密码前面都加了{noop}是JDBC这种查询方式默认的加密算法.实际上,这种方式还需要定义好几个表,此处我们演示定

SpringBootSecurity学习(08)网页版登录整合MyBatis

创建数据库 前面介绍了springboot-security整合jdbc从数据库中查询用户的方式,适用性有限,下面介绍最常用的整合MyBatis,这种在开发和生产环境中是最常用,也是最实用的.首先需要创建数据库表,我们来创建三张表,分别是用户表,角色表,还有用户角色表,首先看用户表: 只有三个字段,具体业务中需要几个字段完全由我们自己设计.密码是admin,是加密的,后面的配置中会看到加密方式,与前面介绍的在内存中配置默认用户的方式类似.下面看角色表: 注意每个角色名字的前面都加了一个ROLE_

SpringBootSecurity学习(09)网页版登录配置Session共享

场景 当后台项目由部署在一台改为部署在多台以后,解决session共享问题最常用的办法就是把session存储在redis等缓存中.关于session和cookie概念这里就不再赘述了,在springboot-security环境下,把session存储到redis中共享是非常非常简单的,除了多了一些配置,几乎不用改任何代码.共享session达到的效果就是,用户在一台服务器上面登录成功后,访问另外一台,用户也是处于登录状态.下面创建两个一样的项目,来配置session共享. 增加依赖 把ses

SpringBootSecurity学习(11)网页版登录之URL动态权限

动态权限 前面讨论用户登录认证的时候,根据用户名查询用户会将用户拥有的角色一起查询出来,自动实现判断当前登录用户拥有哪些角色.可以说用户与角色之间的动态配置和判断security做的非常不错.不过在配置方法级别的权限的时候,使用注解虽然是一种比较优雅的方式,但是要求在开发的时候就知道当前url对应哪些角色,无法实现动态的配置,而实际的项目中,每个链接允许哪些角色访问也不是一成不变的,因此下面我们来实现自己的路由判断. 创建表 前面的讨论中,我们创建了用户表,角色表和用户角色中间表,下面来创建菜单

Android实战(一)学习了多个控件实现登录及记住密码功能

首先确定一下需要的控件: 两个EditText:用于输入账号和密码 一个button:用于登录查看账号和密码是否正确 一个checkbox:用于记住密码和账户 一个Androidstudio:用于编写代码,当然牛逼的人也推荐使用记事本写代码,废话不多说开工. 创建一个App项目加入两个布局两份Java.class ,在Androidmanifest.xml里面注册第二个布局. 准备完毕 1.在初始布局中加入上述控件,并为其设置好id 代码如下所示 <LinearLayout xmlns:andr

Java使用SSM框架实现登录页面记住密码功能

最终效果展示: 1.登录页面JSP代码 <label class="checkbox"> <input type="checkbox" name="rememberMe" id="rememberMe" onclick="remember();"/> 记住密码 </label> //选中记住密码触发事件,如果选中就赋值为1 ,否则赋值为0 function remembe

SpringBootSecurity学习(12)前后端分离版之简单登录

前后端分离 前面讨论了springboot下security很多常用的功能,其它的功能建议参考官方文档学习.网页版登录的形式现在已经不是最流行的了,最流行的是前后端分离的登录方式,前端单独成为一个项目,与后台的交互,包括登录认证和授权都是由异步接口来实现.在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高.这种应用模式比较适合纯网页应用, 但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而