RememberMe简介及用法

简介: RememberMe功能并非简单记住用户名密码,而是通过服务端生成令牌(Token)存于Cookie中,实现关闭浏览器后仍保持登录状态。但直接使用明文令牌有安全风险,可通过将Token持久化到数据库并增加二次校验机制,提升系统安全性与稳定性。

1.基本简介

RememberMe功能十分常见,如下图的QQ邮箱登录时的“记住我”的功能选项。

这里读者朋友们可能会有一个常见误区,“记住我”就是把用户的用户名/密码使用Cookie保存在浏览器,下次登录时不用再次输入,这个理解是非常不对的。

我们这里所说的RememberMe是一种服务器端的行为。传统的登录方式基于Session会话,一旦用户关闭浏览器重新打开,就要重新登录,这样太过于烦琐,如果有一种机制可以让用户关闭并重新打开浏览器之后,还能保持登录状态就会方便很多,这种实现之一就是RememberMe。

其大概实现如下面的流程所示,但是读者可能也发现这种将用户密码保存在浏览器的行为存在安全隐患。

2.基本用法

在前两天的内容后,我们直接在原有代码修改,增添RememberMe功能。

1.注册配置信息

package com.yzxb.SpringSecurity.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .and()
                .rememberMe()
                .key("ikun")
                .and()
                .csrf().disable();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("ikun")
                .password("5201314")
                .roles("admin");
    }
}

2.重启验证功能

此时重启项目,访问我们原来的接口:http://localhost:8080/demo/index,会发现登录窗口多了一个勾选框,当我们勾选之后,登录。之后关闭浏览器再次访问上述地址,就会发现无需重复登录了。

注意这里不要重启后端服务


那么这一切就因为多了一个勾选框就实现的流程,到底是怎么实现的呢?我们大概可以猜出来他会告诉服务端是否开启RememberMe功能,当请求后,我们会发现响应头多了一个Set-Cookie参数,如下图:

在响应头给了一个remember-me的字符串,以后所有的请求头Cookie字段都会自动携带这个令牌,服务端可以利用该令牌校验用户身份是否合法。

大致流程如上所述,但是读者们应该想起来我们前面说的问题了,这种令牌一旦泄露,不怀好意的Ikun们可以拿这个令牌随意访问系统,从而给系统带来风险和性能压力。怎么优化呢?

类似于我们前面的自定义认证一样,将Token持久化到DB即可。这里我们也可以做进一步的二次校验,从而保证系统的全局安全。

相关文章
|
2月前
|
关系型数据库 应用服务中间件 nginx
容器化部署引擎Docker
Docker是一种轻量级容器化技术,通过镜像打包应用及依赖,实现跨环境一致部署。它利用沙箱机制隔离容器,解决开发、测试、生产环境差异与组件兼容性问题,相比虚拟机更高效便捷,提升应用交付效率。
容器化部署引擎Docker
|
2月前
|
缓存 运维 调度
基于 SGlang RBG + Mooncake 打造生产级云原生大模型推理平台
本文旨在阐明如何将 Mooncake Store 作为 RBG 编排下 SGLang PD 分离推理服务的补充角色,系统化实现生产级 KVCache 外置能力。
|
2月前
|
存储 数据库
数据库设计三范式
本文介绍了数据库设计中的三范式(1NF、2NF、3NF),通过实例讲解各范式的要求与应用场景。第一范式要求字段原子性,不可再分;第二范式要求消除部分依赖,确保主键决定所有非主键字段;第三范式消除传递依赖。同时指出,范式是参考而非绝对准则,实际设计应结合业务需求灵活处理,以降低维护成本、提升效率。
|
2月前
|
人工智能 自然语言处理 机器人
适合电商的智能客服系统推荐(2025年12月更新)
瓴羊Quick Service是阿里云旗下智能客服产品,深度整合电商交易链路,支持全渠道协同与大模型应用,具备高并发稳定性,助力中大型电商实现服务智能化与业务增长。
|
5月前
|
传感器 人工智能 安全
物联网
万物互联,智启未来。物联网通过连接人、物、环境,重塑生活、城市与产业。从智能家居到智慧城市,从工业互联网到精准农业,数据驱动智能化变革。融合AI、5G等技术,构建高效、安全、可持续的智能世界,开启人类社会新篇章。(238字)
|
监控 程序员 网络安全
阿里云帮你一键部署财务操作系统Maybe
Maybe财务操作系统,旨在简化个人财务管理。通过账户管理、实时交易监控、投资组合管理和财务健康分析等核心功能,帮助用户高效掌握财务状况。阿里云提供一键部署服务,轻松快速启动使用。
阿里云帮你一键部署财务操作系统Maybe
|
数据采集 JSON 小程序
【微信小程序】认识小程序项目的基本组成结构
文章目录 每日推荐 小程序的项目结构 1.了解项目的基本组成结构 2.小程序页面的组成部分 json配置文件 json配置文件的作用 app.json配置文件 project.config.json配置文件 sitemap.json配置文件 页面中的.json配置文件 新建小程序页面 修改项目首页 WXML模板 什么是WXML? WXML与HTML的区别 WXSS样式 什么是WXSS? WXSS和CSS的区别 js逻辑交互 小程序中的.js文件 小程序中.js文件的分类
【微信小程序】认识小程序项目的基本组成结构
|
网络协议 数据可视化 Unix
4_2_AliOS Things 操作系统网络篇之 lwIP|学习笔记
快速学习4_2_AliOS Things 操作系统网络篇之 lwIP。
837 0
4_2_AliOS Things 操作系统网络篇之 lwIP|学习笔记
数据结构学习笔记——链式存储结构实现栈(链栈)
数据结构学习笔记——链式存储结构实现栈(链栈)
数据结构学习笔记——链式存储结构实现栈(链栈)