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

 更新时间:2020年03月09日 12:33:02   作者:程序晓猿  
这篇文章主要介绍了Spring security实现记住我下次自动登录功能过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、原理分析

第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecurity就会放行这次访问。

二、实现方式

2.1 简单实现方式

(1) 在springsecurity的配置文件中,http节点下增加一个remember-me配置

<security:http auto-config="true" use-expressions="false">
    <!-- 配置链接地址,表示任意路径都需要ROLE_USER权限,这里可以配置
     一个逗号隔开的角色列表-->
    <security:intercept-url pattern="/**" access="ROLE_USER"/>

    <!--自定义登录页面-->
    <security:form-login login-page="/login.html" login-processing-url="/login"
               username-parameter="username" password-parameter="password"
               authentication-failure-forward-url="/failed.html"
               default-target-url="/index.html"

    />
    <!--关闭csrf,默认是开启的-->
    <security:csrf disabled="true"/>

    <security:remember-me remember-me-parameter="remembermeParamater" />
    <!-- 退出 -->
    <security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.html"/>
  </security:http>

其中remember-me-parameter="remembermeParamater"指定前台传递的是否rememberme的参数名,前台要传递的参数值是true或false

(2)前台登录页面上增加一个checkbox

<form action="/login" method="post">
    用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
    密 码:<input type="password" name="password" placeholder="请输入密码"><br>
    记住我:<input id="_spring_security_remember_me" type="checkbox" name="remembermeParamater" value="true">
    <input type="submit" value="登录">
  </form>

checkbox的name属性要和上边配置文件中的remember-me-parameter="remembermeParamater"保持一致。

(3)测试

启动工程,进行登录,登录成功后观察cookie,会发现服务器端返回了一个名为remember-me的cookie

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

这种方式有个弊端,浏览器端要携带的这个cookie值服务端是存放在内存中的,并没有进行持久化,所以如果服务重启后服务器端存储的这个值就会丢失,浏览器端的rememberme就会失效。为了解决这个问题就需要将服务器端生成的这个cookie值持久化到数据库中。

2.2 数据库实现方式

(1)创建一张表用来持久化rememberme的记录

-- 创建记录rememberme记录的表
CREATE TABLE persistent_logins
(
 username VARCHAR(64),
 series  VARCHAR(64),
 token   VARCHAR(64),
 last_used DATE 
 );

(2)将spring-security 配置文件中的rememberme标签的内容改为如下内容

<security:remember-me remember-me-parameter="remembermeParamater" data-source-ref="dataSource"
               token-validity-seconds="86400"/>

data-source-ref="dataSource"用来指定数据源,spring-security通过数据源来操作数据库中的persistent_logins表

token-validity-seconds表示rememberme的有效时间,以秒为单位,这里的86400=24*3600表示一天

(3)测试

启动工程,进行登录,登录成功后会在persistent_logins表中生成一条记录,


关闭浏览器再次访问时会根据浏览器中携带的cookie值来查找数据库中的这条记录,如果查询到了就认证通过

三、区分是密码登录还是rememberme登录

在用户进行一些敏感操作时,需要区分是否是rememberme登录,如果是需要让用户跳转到登录页面。

在congtroller层提供一个方法来进行判断

@GetMapping("/isRemembermeUser")
public boolean isRemembermeUser(){
  Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  if(authentication==null){
    return false;
  }
  //判断当前用户是否是通过rememberme登录,是返回true,否返回false
  return RememberMeAuthenticationToken.class.isAssignableFrom(authentication.getClass());
}

先使用密码登录,访问http://localhost/user/isRemembermeUser.do,后台接口返回false,再关闭浏览器再次访问这个地址,后台接口返回true,表示这次是使用rememberme进行的认证。

测试工程代码的地址:工程示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Spring中单例Bean是线程安全的吗

    浅谈Spring中单例Bean是线程安全的吗

    这篇文章主要介绍了浅谈Spring中单例Bean是线程安全的吗?具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Eclipse中Debug时鼠标悬停不能查看变量值解决办法

    Eclipse中Debug时鼠标悬停不能查看变量值解决办法

    这篇文章主要介绍了Eclipse中Debug时鼠标悬停不能查看变量值解决办法,以及分享了一个简单补全代码的方法,还是比较不错的,需要的朋友可以参考下。
    2017-11-11
  • java开发分布式服务框架Dubbo调用过程

    java开发分布式服务框架Dubbo调用过程

    这篇文章主要为大家介绍了java开发分布式服务框架Dubbo调用过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • SpringBoot图文并茂详解如何引入mybatis与连接Mysql数据库

    SpringBoot图文并茂详解如何引入mybatis与连接Mysql数据库

    这篇文章主要介绍了SpringBoot如何引入mybatis与连接Mysql数据库,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 细致解读希尔排序算法与相关的Java代码实现

    细致解读希尔排序算法与相关的Java代码实现

    这篇文章主要介绍了希尔排序算法与相关的Java代码实现,希尔排序的时间复杂度根据步长序列的不同而不同,需要的朋友可以参考下
    2016-05-05
  • JAVA中Collections.sort()方法使用详解

    JAVA中Collections.sort()方法使用详解

    这篇文章主要给大家介绍了关于JAVA中Collections.sort()方法使用的相关资料,Java中Collections.sort()方法是用来对List类型进行排序的,文中通过代码将使用的方法介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Java多线程编程之读写锁ReadWriteLock用法实例

    Java多线程编程之读写锁ReadWriteLock用法实例

    这篇文章主要介绍了Java多线程编程之读写锁ReadWriteLock用法实例,本文直接给出编码实例,需要的朋友可以参考下
    2015-05-05
  • spring boot过滤器FilterRegistrationBean实现方式

    spring boot过滤器FilterRegistrationBean实现方式

    这篇文章主要介绍了spring boot过滤器FilterRegistrationBean实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 轻松理解Java面试和开发中的IoC(控制反转)

    轻松理解Java面试和开发中的IoC(控制反转)

    在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。下文给大家介绍Java面试和开发中的IoC(控制反转)知识,需要的朋友参考下吧
    2017-07-07
  • Java 天生就是多线程

    Java 天生就是多线程

    这篇文章主要介绍了Java天生就是多线程,程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线程,更多相关内容需要的小伙伴可以参考一下
    2022-07-07

最新评论