<强>一、原理分析强>
第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie, springsecurity就会放行这次访问。
<强>二,实现方式强>
2.1简单实现方式
(1)在springsecurity的配置文件中,http节点下增加一个记得我配置
& lt;安全:http auto-config=" true " use-expressions=癴alse”比; & lt; !——配置链接地址,表示任意路径都需要ROLE_USER权限,这里可以配置 一个逗号隔开的角色列表——比; & lt;安全:intercept-url模式=?* *”访问=" ROLE_USER "/比; & lt; !——自定义登录页面——比; & lt;安全:登录登录页面="/登录。html/登录“login-processing-url=username参数="用户名" password参数="密码" authentication-failure-forward-url="/failed.html” default-target-url="/index . html "/比; & lt; !——关闭csrf,默认是开启的——比; & lt;安全:csrf禁用=" true "/比; & lt;安全:记得我remember-me-parameter=" remembermeParamater "/比; & lt; !——退出——比; & lt;安全:注销invalidate-session=" true " logout-url="/注销。做“logout-success-url="/login.html”/比; & lt;/安全:http>
其中remember-me-parameter=" remembermeParamater "指定前台传递的是否rememberme的参数名,前台要传递的参数值是true或false
(2)前台登录页面上增加一个复选框
& lt;形式action="/登录”方法=皃ost”比; 用户名:& lt; input type=" text " name="用户名"占位符=扒胧淙胗没白4? lt; br> 密码:& lt;输入type="密码" name="密码"占位符=扒胧淙朊苈搿弊4? lt; br> 记住我:& lt;输入id=癬spring_security_remember_me”类型=案囱】颉眓ame=" remembermeParamater " value=" https://www.yisu.com/zixun/true "比; & lt;输入类型="提交" value=" https://www.yisu.com/zixun/登录”比; & lt;/form>
复选框的名字属性要和上边配置文件中的remember-me-parameter=皉emembermeParamater”保持一致。
(3)测试
启动工程,进行登录,登录成功后观察饼干,会发现服务器端返回了一个名为记念我的饼干
现在关闭浏览器,再次打开并访问,只要不清除饼干就可以直接访问资源,不需要重新登录。
这种方式有个弊端,浏览器端要携带的这个cookie值服务端是存放在内存中的,并没有进行持久化,所以如果服务重启后服务器端存储的这个值就会丢失,浏览器端的rememberme就会失效。为了解决这个问题就需要将服务器端生成的这个cookie值持久化到数据库中。
2.2数据库实现方式
(1)创建一张表用来持久化rememberme的记录
——创建记录rememberme记录的表 创建表persistent_logins ( 用户名VARCHAR (64), 系列VARCHAR (64), 令牌VARCHAR (64), last_used日期);
(2)将spring security配置文件中的rememberme标签的内容改为如下内容
& lt;安全:记得我remember-me-parameter=皉emembermeParamater data-source-ref”=笆菰础? token-validity-seconds=" 86400 "/祝辞
data-source-ref=用“数据源”来指定数据源,spring security通过数据源来操作数据库中的persistent_logins表
token-validity-seconds表示rememberme的有效时间,以秒为单位,这里的86400=24 * 3600表示一天
(3)测试
启动工程,进行登录,登录成功后会在persistent_logins表中生成一条记录,
@GetMapping ("/isRemembermeUser”) 公共布尔isRemembermeUser () { 验证身份验证=SecurityContextHolder.getContext () .getAuthentication (); 如果(身份验证==null) { 返回错误; }//判断当前用户是否是通过rememberme登录,是返回真,否返回错误的 返回RememberMeAuthenticationToken.class.isAssignableFrom (authentication.getClass ()); }