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月前
|
Java Spring UED
Spring Cloud熔断降级
熔断降级是应对服务雪崩的核心手段。熔断通过断路器统计异常或慢请求比例,超阈值后拦截所有请求,防止系统崩溃;降级则在调用失败时返回默认数据或友好提示,提升用户体验。二者结合,在服务异常时快速熔断并触发降级逻辑。断路器有closed、open、half-open三种状态,实现自动恢复机制,保障系统稳定性。
Spring Cloud熔断降级
|
3月前
|
微服务 监控
认识Seata
Seata是阿里巴巴开源的分布式事务解决方案,通过事务协调者(TC)、事务管理器(TM)和资源管理器(RM)协同工作,实现全局事务一致性。支持XA、AT、TCC、SAGA四种模式,其中AT为默认模式,具备最终一致性与低侵入性,广泛应用于微服务架构中。
认识Seata
|
3月前
|
运维 监控 Java
【Linux基础】开发日常:盘点后端开发中最高频使用的10个Linux命令
本文为后端开发者整理了日常运维中最常用的10个Linux命令,涵盖文件查看、日志监控、进程管理、网络排查等核心场景。从`ls`、`cd`到`tail`、`grep`,再到`ps`、`netstat`、`top`等,结合实际案例讲解高频用法,助你高效应对服务器操作,提升开发效率。
|
3月前
|
缓存 NoSQL 关系型数据库
【高并发实战】Redis缓存穿透、击穿、雪崩:3大经典的“炸库”危机与自救指南
本文详解缓存穿透、击穿、雪崩三大问题:穿透是查不存在的数据,击穿是热点Key失效被高并发冲击,雪崩是大量Key同时过期或Redis故障。结合比喻与解决方案,助你彻底理解并防范数据库风险。
|
3月前
|
安全 Java 开发工具
工程搭建与验证
本文介绍如何使用阿里云脚手架快速搭建Spring Boot工程,并整合Spring Security实现基础安全控制。包含工程创建、代码导入、Web依赖配置、访问接口开发及Security默认登录验证,附完整代码仓库地址。
|
3月前
|
弹性计算 安全 Linux
【安全硬核】3分钟学会配置Linux防火墙:Firewalld实战指南
本文介绍Linux服务器防火墙Firewalld的使用,作为云安全组后的第二道防线。涵盖启停服务、开放/关闭端口、查看状态、IP白名单设置等核心操作,并强调与阿里云安全组协同配置的重要性,助力构建生产环境的纵深防御体系。(238字)
|
3月前
|
运维 监控 Shell
【自动化运维】告别手动搬运!编写Shell脚本自动备份与清理日志
本文介绍如何通过Shell脚本结合Crontab,实现服务器日志的自动备份与清理。每天凌晨2点自动压缩昨日日志并保存至备份目录,同时删除7天前的旧备份,防止磁盘占满。脚本具备目录创建、压缩打包、错误提示和日志记录功能,操作安全可靠,适合Linux运维新手实践自动化管理。
|
3月前
|
运维 安全 Shell
【运维救火】服务器磁盘满了?教你3招快速定位“空间杀手”并清理
当磁盘写满时,别慌!本文提供一套标准化排查流程:先用 `df -h` 定位问题磁盘,再用 `du` 命令层层深入找出大文件;清理时推荐清空而非删除日志,避免句柄泄露。若空间未释放,可用 `lsof | grep deleted` 查找被占用的文件并重启对应服务。四步冷静救火,快速恢复系统稳定。
|
3月前
|
Java Shell 开发工具
【Git入门】Git常用命令大全:从add到push,一图胜千言
本文深入浅出地讲解Git核心概念与常用命令,涵盖工作区、暂存区、本地仓库和远程仓库三大区域,梳理从配置、克隆、提交到同步的完整流程,并介绍撤销修改、查看历史、.gitignore等实用技巧,助力开发者高效协作。
|
3月前
|
SQL 关系型数据库 MySQL
【数据库进阶】为什么你的SQL查询这么慢?索引失效的7个常见场景
本文总结MySQL索引失效的7大常见场景:模糊查询以%开头、索引列参与计算或函数、隐式类型转换、违背最左前缀法则、OR条件使用不当、不等号查询及全表扫描风险,并结合EXPLAIN工具教你如何诊断与优化,提升查询性能。