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

相关文章
|
3月前
|
微服务 监控
认识Seata
Seata是阿里巴巴开源的分布式事务解决方案,通过事务协调者(TC)、事务管理器(TM)和资源管理器(RM)协同工作,实现全局事务一致性。支持XA、AT、TCC、SAGA四种模式,其中AT为默认模式,具备最终一致性与低侵入性,广泛应用于微服务架构中。
认识Seata
|
3月前
|
Java 调度
什么是分片广播任务
本文介绍XXL-JOB的分片广播机制,通过集群执行器动态分片处理任务。调度中心为每个执行器分配分片参数,实现任务并行处理,提升效率。适用于大数据量分布式场景,支持动态扩容,每台机器处理部分数据,显著降低耗时。开发时可通过`getShardIndex()`和`getShardTotal()`获取分片信息,灵活控制业务逻辑。
|
3月前
|
SQL Java 数据库连接
MyBatis-Plus 超详细教程:从入门到实战,一站式掌握
MyBatis-Plus 是 MyBatis 的增强工具,简化单表 CRUD 操作,无需编写 XML,支持条件构造器、分页插件、逻辑删除、枚举与 JSON 处理,提升开发效率,兼顾灵活性与便捷性,助力从入门到实战一站式掌握。
MyBatis-Plus 超详细教程:从入门到实战,一站式掌握
|
3月前
|
安全 Java 开发工具
工程搭建与验证
本文介绍如何使用阿里云脚手架快速搭建Spring Boot工程,并整合Spring Security实现基础安全控制。包含工程创建、代码导入、Web依赖配置、访问接口开发及Security默认登录验证,附完整代码仓库地址。
|
5月前
|
人工智能 安全 架构师
2025云栖大会 | 阿里云网络技术Session主题资料和视频回放归档
2025年9月24日-26日,杭州,一年一度的云栖大会如期而至;阿里云飞天洛神云网络作为阿里云计算的连接底座,是飞天云操作系统的核心组件,致力于为上云企业提供高可靠、高性能、高弹性、智能的连接服务。本次云栖,云网络产品线也带来全系列产品升级,以及创新技术重磅解读,围绕增强确定性、提效自动化、深耕智能化和敏捷全球化带来技术、产品和服务升级,以及全新的云网络产品生态合作计划发布。
717 4
|
3月前
|
弹性计算 应用服务中间件 Linux
【运维实战】手把手教你在阿里云ECS上从零搭建Nginx服务器
本文详细介绍如何在阿里云ECS服务器(Alibaba Cloud Linux/CentOS/Ubuntu)上从零部署Nginx。涵盖安装、启动服务、安全组配置、验证访问及页面修改,并提供常用命令速查,助你快速搭建首个Web服务。
|
3月前
|
弹性计算 安全 Linux
【安全硬核】3分钟学会配置Linux防火墙:Firewalld实战指南
本文介绍Linux服务器防火墙Firewalld的使用,作为云安全组后的第二道防线。涵盖启停服务、开放/关闭端口、查看状态、IP白名单设置等核心操作,并强调与阿里云安全组协同配置的重要性,助力构建生产环境的纵深防御体系。(238字)
|
3月前
|
存储 运维 Java
【Docker入门】5分钟彻底搞懂镜像、容器与仓库:Docker的核心三剑客
Docker 通过“镜像、容器、仓库”三大核心实现“一次构建,到处运行”。镜像如食谱,容器是做好的菜,仓库似超市货架。用生活化比喻秒懂其原理与协作流程。
|
3月前
|
安全 Linux Shell
【Linux进阶】拒绝Permission denied!彻底搞懂chmod与chown文件权限
本文深入解析Linux权限管理核心命令`chmod`与`chown`,教你读懂`ls -l`输出,掌握数字权限(如755、644)的含义与应用场景,理解属主与属组的作用,强调最小权限原则,拒绝滥用`chmod 777`,保障服务器安全。
|
3月前
|
运维 监控 Shell
【自动化运维】告别手动搬运!编写Shell脚本自动备份与清理日志
本文介绍如何通过Shell脚本结合Crontab,实现服务器日志的自动备份与清理。每天凌晨2点自动压缩昨日日志并保存至备份目录,同时删除7天前的旧备份,防止磁盘占满。脚本具备目录创建、压缩打包、错误提示和日志记录功能,操作安全可靠,适合Linux运维新手实践自动化管理。