RememberMe简介及用法

简介: RememberMe功能通过令牌保持用户登录状态,避免重复登录。其原理是在用户勾选后下发remember-me Cookie,后续请求凭此令牌验证身份。但默认实现存在安全风险,令牌泄露可导致非法访问。可通过持久化Token至数据库并增加二次校验提升安全性,保障系统稳定与用户数据安全。(238字)

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即可。这里我们也可以做进一步的二次校验,从而保证系统的全局安全。

相关文章
|
算法 测试技术 编译器
掌握CTest:CTest综合指南
掌握CTest:CTest综合指南
1359 1
|
6月前
|
存储 人工智能 运维
AR眼镜+AI:重构工业运维场景的智能核心载体
AR眼镜融合AI、语音交互与影像技术,实现仪器仪表自动识别、分时巡检提示、全程录像追溯与远程协作指导,提升巡检效率60%以上,误判率低于0.5%,推动工业运维向智能化、标准化、可追溯转型,成为数字化转型关键终端。
|
7月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
MyBatisPlus是MyBatis的增强工具,简化单表CRUD操作,无需编写XML,通过BaseMapper、条件构造器、分页插件等实现高效开发,支持自定义SQL、逻辑删除、枚举与JSON处理,提升开发效率。
|
7月前
|
存储 缓存 负载均衡
Nacos注册中心
本文详细介绍Nacos的安装部署、服务注册与发现、分级模型、负载均衡策略、权重控制、环境隔离及实例类型等核心功能,涵盖从入门到实战的全流程,助力掌握Nacos在微服务架构中的应用,实现高效服务治理与配置管理。
|
10月前
|
安全 搜索推荐 大数据
Dataphin资产上下架审批管理——让企业数据资产“可控、可追溯、高效流转”
Dataphin推出资产上下架审批管理功能,通过灵活分层审批、自定义流程模板及对接企业OA系统,实现数据资产全生命周期的统一管控与高效流转,提升数据安全与运营效率。
306 0
|
12月前
|
弹性计算
阿里云服务器【地域】怎么选择划算一些?哪个地域好?
选择阿里云服务器地域时,优先考虑用户所在地区以实现就近访问。从划算角度看,部分地域如华北3(张家口)、华北6(乌兰察布)、华南2(河源)、华中1(武汉)常有优惠活动。此外,华北1(青岛)地域的公网带宽价格更具优势,适合对带宽成本敏感的用户。具体信息可查看阿里云ECS页面或官方文档了解最新优惠和选择建议。
|
机器学习/深度学习 存储 分布式计算
ODPS驱动电商仓储革命:动态需求预测系统的落地实践
本方案基于ODPS构建“预测-仿真-决策”闭环系统,解决传统仓储中滞销积压与爆款缺货问题。通过动态特征工程、时空融合模型与库存仿真引擎,实现库存周转天数下降42%,缺货率下降65%,年损减少5000万以上,显著提升运营效率与GMV。
1111 1
|
7月前
|
缓存 NoSQL Java
微服务高频面试题
本课程系统讲解微服务架构核心知识,涵盖SpringBoot与SpringCloud应用、Nacos注册与配置中心、OpenFeign远程调用、Sentinel熔断限流、Gateway网关鉴权、分布式事务Seata、RabbitMQ消息队列、Elasticsearch搜索及Redis缓存等技术,结合实战场景解析服务治理、数据同步与高并发处理方案。
|
7月前
|
Java 大数据 Maven
Excel工具-HUTOOL-输出Excel
Hutool封装Excel写出功能,提供ExcelWriter和BigExcelWriter,支持写入List、Map、Bean等数据类型,可自定义样式、标题别名、多Sheet导出,并解决大数据量内存溢出问题,操作简便且高效。
|
10月前
|
安全 云计算
面向对象
面向对象三大特性——封装、继承、多态,是构建软件世界的哲学基石。封装隐藏细节,提升安全与模块化;继承实现代码复用,构建层次体系;多态增强灵活性,支持统一接口下的多样化行为。三者协同,形成高内聚、低耦合、易扩展的系统设计,不仅是编程技术,更是应对复杂性的思维智慧。(238字)