好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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"        <input type="submit" value="login" /><br/>
    </form>
</body>
</html>

主要代码为:

<input type="checkbox" name="remember-me"  src="/uploads/allimg/220727/1030462Y1-0.png" />

关闭浏览器,重新打开,重新请求:
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记住我内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文地址:https://blog.csdn.net/qq_38322527/article/details/123109261

查看更多关于Spring Security安全框架之记住我功能的详细内容...

  阅读:17次