天天看点

SpringSecurity学习之路11-实现记住我的功能

目的:用户勾选记住我之后,一段时间内免登陆。

{都是接着之前的代码,一点点加、重构代码的,不会在这里详细叙述之前提到的东西,以后的篇幅也是这样}

下图是关于SpringSecurity的原理介绍:

SpringSecurity学习之路11-实现记住我的功能

当登录成功之后,RememberService会将Token存储进浏览器Cookie,再将它写入进数据库里。当再次进行登录操作时,便会拿着浏览器中的token去数据库中查找,查找成功之后便会调用UserDetailsService。

首先需要在原先的登录页面中加一个checkbox

SpringSecurity学习之路11-实现记住我的功能

 注意,name的值必须叫这个。

因为是将token信息存储进了数据库,所以还需要进行下数据库配置,配置信息写在application.Properties中。

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/imooc-demo?useUnicode=yes&characterEncoding=utf8
spring.datasource.username=name
spring.datasource.password=password
           

然后将数据源以及UserDetailsService注入进来

SpringSecurity学习之路11-实现记住我的功能

接下来要做的事情就是在BrowserSecurityConfig类(继承了WebSecurityConfigurerAdapter)中新建persistentTokenRepository()方法(方法名无要求),其返回类型为PersistentTokenRepository。

SpringSecurity学习之路11-实现记住我的功能

 红色标注的代码作用是,启动时自动创建存储token的表{点进这个方法里提供有SQL语句,可以手动创建}。

最后就是在configure()方法中将remember配置进去,代码如下:

SpringSecurity学习之路11-实现记住我的功能

至此,关于rememberMe的配置就结束了,原理图看着挺多的,配置起来就这几步。

下面通过debug的方式,实际感受下rememberMe的工作流程。(结合最上面的rememberMe原理图)

首先,清除原有token、cookie数据,在地址栏访问/user,会进入到登录页面,输入正确的信息之后点击登录,会进入到UsernamePasswordAuthenticationFilter类中:

SpringSecurity学习之路11-实现记住我的功能

判断请求是不是以post方式提交的,然后获取到用户名和密码信息,并生成token

SpringSecurity学习之路11-实现记住我的功能

在判断登录成功之后,会进入到以下方法中去

SpringSecurity学习之路11-实现记住我的功能

 这个就是登录成功之后所进入到的方法,第一个红框部分意思是将登录成功的用户信息,包括权限信息等存储进session。第二个红框部分就是调用rememberServices方法,往下执行

SpringSecurity学习之路11-实现记住我的功能

 创建一个新的token,存储进数据库。向浏览器返回cookie信息。至此,流程结束。现在数据库表中已经有了一条信息。

SpringSecurity学习之路11-实现记住我的功能

接下来我们重启服务,重启浏览器,直接访问/user,看看流程是咋走的。

SpringSecurity学习之路11-实现记住我的功能

判断session里是否有用户权限信息,即该请求是否通过了UsernamePasswordAuthenticationFilter或BasicAuthenticationFilter的验证,如果没有通过验证, 则调用rememberServices的autoLogin方法。接着往下走,

SpringSecurity学习之路11-实现记住我的功能

根据Series获取Token信息,然后根据查询到的token信息里的用户名,使用UserDetailsService来做用户登录

SpringSecurity学习之路11-实现记住我的功能

往下走,如果获得了用户信息则表明登录成功,并将其存储进session,结束。

SpringSecurity学习之路11-实现记住我的功能

 至此,rememberMe功能介绍完毕。