Spring Security安全框架之记住我功能

 更新时间:2022年02月24日 14:48:17   作者:专注写bug  
这篇文章主要介绍了Spring Security安全框架之记住我,本次就来探究如何实现这种自动登录、记住我的功能,通过实例代码图文相结合给大家介绍的非常详细,需要的朋友可以参考下

简介

在一般的网站中,比如Bilibili。当用户登录成功后,关闭浏览器后,下次重新进入网站,可以自动登录。

本次就来探究如何实现这种自动登录记住我的功能。

思维逻辑

需要实现记住我的功能操作,需要保证具体的实现方式,接下来就来梳理下。

首先,在Security框架中,针对记住我的功能实现,Security框架本身对其做了一定的封装,其实现原理为:

  • 浏览器:cookie中存储加密后的数据串
  • 数据库:MySQL等数据库中存储加密后的数据串用户基本信息数据。

当认证器中,根据客户端传递的cookie值,查询服务器,符合用户基本信息,则自动放行。

配置和测试

数据库创建

本质上是不要创建的,Security框架针对记住我功能的实现,会在数据库不存在表时,org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl自动创建一个persistent_logins表。

如果想手动创建,可以执行下列sql进行表的创建:

CREATE TABLE persistent_logins (
username VARCHAR ( 64 ) NOT NULL,
series VARCHAR ( 64 ) PRIMARY KEY,
token VARCHAR ( 64 ) NOT NULL,
last_used TIMESTAMP NOT NULL 
);

配置类注入数据源,配置操作数据库对象

import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;

/**
   * 注入数据源(记住我)
   */
  @Autowired
  private DataSource dataSource;
  /**
   * 配置操作数据库对象
   * @return
  @Bean
  public PersistentTokenRepository persistentTokenRepository(){
      JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
      jdbcTokenRepository.setDataSource(dataSource);
      jdbcTokenRepository.setCreateTableOnStartup(true); // 如果没有配置记住我的数据表,则自动生成
      return jdbcTokenRepository;
  }

配置config(HttpSecurity)

.and()
.rememberMe().tokenRepository(persistentTokenRepository()) // 配置记住我的功能,同时增加查询数据库 cookie 值
.tokenValiditySeconds(60)  // 设置cookie的有效时间(秒为单位)
.userDetailsService(mySecurityService) // 查询数据库

页面增加记住我选项

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/user/login" method="post">
        用户名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        <input type="checkbox" name="remember-me" title="记住我" />自动登录<br/>
        <input type="submit" value="login" /><br/>
    </form>
</body>
</html>

主要代码为:

<input type="checkbox" name="remember-me" title="记住我" />自动登录<br/>

【注意:】name="remember-me" 这是固定写法,否则无法识别!

测试

重启服务器,请求需要被认证的url:

http://localhost/login.html

关闭浏览器,重新打开,重新请求:
http://localhost/loginSuccess.html

注意事项

由于数据库本身未创建 persistent_logins表,只是在配置类中申明创建表

此时数据库中,可以看到已存在表信息:

此处需要注意的是,如果配置了自动创建表,如果已存在指定的表,启动会报错!

原理分析


1、浏览器请求服务器时,会先经过UsernamePasswordAuthenticationFilter进行认证操作
2、如果UsernamePasswordAuthenticationFilter认证成功,会调用其父类 AbstractAuthenticationProcessingFilter中的doFilter方法。
3、最终执行this.successfulAuthentication(request, response, chain, authResult)

org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices中的loginSuccess方法。

然后在org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices#onLoginSuccess中做以下操作:

4、将生成的新的token信息,存储于数据表中,并且也存储在浏览器 cookie 中
5、当浏览器关闭,下次登录时,会根据之前设定的remember-me信息,在org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter中对其验证!

代码下载

springboot-security-09-rememberMe

gitee 代码下载

到此这篇关于Spring Security安全框架之记住我的文章就介绍到这了,更多相关Spring Security记住我内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Listener监听器生命周期(详解)

    基于Listener监听器生命周期(详解)

    下面小编就为大家带来一篇基于Listener监听器生命周期(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • SpringBoot调用Poi-tl实现渲染数据并生成Word文档

    SpringBoot调用Poi-tl实现渲染数据并生成Word文档

    这篇文章主要为大家详细介绍了SpringBoot如何调用Poi-tl实现渲染数据并生成Word文档,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2023-09-09
  • java实现收藏名言语句台词的app

    java实现收藏名言语句台词的app

    本文给大家分享的是使用java制作的记录名人名言台词等等让你难忘的语句的APP的代码,非常的实用,有需要的小伙伴可以参考下。
    2015-04-04
  • IDEA SpringBoot 项目配置Swagger2的详细教程

    IDEA SpringBoot 项目配置Swagger2的详细教程

    这篇文章主要介绍了IDEA SpringBoot 项目配置Swagger2的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • JAVA实现按时间段查询数据操作

    JAVA实现按时间段查询数据操作

    这篇文章主要介绍了JAVA实现按时间段查询数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Spring中PathMatcher路径匹配器的实现

    Spring中PathMatcher路径匹配器的实现

    Spring框架中的PathMatcher是一个接口,本文主要介绍了Spring中PathMatcher路径匹配器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 使用springcloud+oauth2携带token去请求其他服务

    使用springcloud+oauth2携带token去请求其他服务

    这篇文章主要介绍了使用springcloud+oauth2携带token去请求其他服务方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java高级之HashMap中的entrySet()方法使用

    Java高级之HashMap中的entrySet()方法使用

    这篇文章主要介绍了Java高级之HashMap中的entrySet()方法使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 熟练掌握Java8新特性之Stream API的全面应用

    熟练掌握Java8新特性之Stream API的全面应用

    Stream是Java8的一大亮点,是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的 聚合操作(aggregate operation)或者大批量数据操作。Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性,感兴趣的朋友快来看看吧
    2021-11-11
  • Java中关于String的两种赋值方式

    Java中关于String的两种赋值方式

    这篇文章主要介绍了Java中关于String的两种赋值方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论