Spring security实现记住我下次自动登录功能过程详解

  

<强>一、原理分析

  

第一次登陆时,如果用户勾选了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)测试

  

启动工程,进行登录,登录成功后观察饼干,会发现服务器端返回了一个名为记念我的饼干

  

 Spring security实现记住我下次自动登录功能过程详解

  

现在关闭浏览器,再次打开并访问,只要不清除饼干就可以直接访问资源,不需要重新登录。

  

这种方式有个弊端,浏览器端要携带的这个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表中生成一条记录,

  

 Spring security实现记住我下次自动登录功能过程详解“> <br/>
  </p>
  <p>关闭浏览器再次访问时会根据浏览器中携带的cookie值来查找数据库中的这条记录,如果查询到了就认证通过</p>
  <p> <强>三、区分是密码登录还是rememberme登录</强> </p>
  <p>在用户进行一些敏感操作时,需要区分是否是rememberme登录,如果是需要让用户跳转到登录页面。</p>
  <p>在congtroller层提供一个方法来进行判断</p>
  
  <pre类=   @GetMapping ("/isRemembermeUser”)   公共布尔isRemembermeUser () {   验证身份验证=SecurityContextHolder.getContext () .getAuthentication ();   如果(身份验证==null) {   返回错误;   }//判断当前用户是否是通过rememberme登录,是返回真,否返回错误的   返回RememberMeAuthenticationToken.class.isAssignableFrom (authentication.getClass ());   }

Spring security实现记住我下次自动登录功能过程详解