1.RememberMe简介及用法

简介: RememberMe功能并非简单保存用户名密码,而是通过服务端生成令牌(Token),借助Cookie实现关闭浏览器后仍保持登录状态。勾选“记住我”后,系统在响应头设置remember-me令牌,后续请求自动携带该令牌验证身份。为提升安全性,可将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即可。这里我们也可以做进一步的二次校验,从而保证系统的全局安全。

目录
相关文章
|
10月前
|
人工智能 前端开发 JavaScript
告别"玄学调试":用这份指令让AI成为你的"赛博华佗"
调试占用了开发者50%的时间?本文提供一套专业的AI调试指令,将大模型转化为"拥有10年经验的代码医生"。通过结构化的诊断-修复-预防流程,告别低效的"玄学调试",实现从"修好Bug"到"根治隐患"的质变。
761 6
|
10月前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
5538 153
|
10月前
|
传感器 数据采集 算法
LET数据集来魔搭了!开源首批超60,000分钟全尺寸人形机器人真机数据
国内最大全尺寸人形机器人真机数据集“LET数据集”正式发布,首批开源超6万分钟高质量数据,覆盖6大真实场景,支持多模态融合与标准化应用,助力具身智能研发,已在魔搭社区开放共享。
814 1
LET数据集来魔搭了!开源首批超60,000分钟全尺寸人形机器人真机数据
|
10月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是成熟的安全框架,提供认证、鉴权及防御攻击功能。支持多种认证方式,如OAuth2、JWT、表单等,基于过滤器链实现安全控制,通过SecurityFilterChain管理多组过滤规则,并利用ExceptionTranslationFilter处理安全异常,保障Web应用安全。
144 0
|
10月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细介绍Nacos作为配置中心的实现原理与实战步骤,涵盖配置管理、热更新、共享配置优先级及集群搭建,帮助微服务应用实现配置动态化、高可用部署。
531 4
|
11月前
|
机器学习/深度学习 人工智能 程序员
StackOverflow已经死亡了吗
StackOverflow曾是程序员的“圣地”,但AI崛起正改变这一格局。ChatGPT等工具以高效即时的优势分流用户,使其面临流量下滑与社区文化挑战。而新兴的大模型实验室Lab4AI则融合算力、实践与协作,构建AI时代下的开发者新生态。从问答到实践,开发者社区正在进化。
575 2
StackOverflow已经死亡了吗
|
10月前
|
存储 缓存 Java
自定义注解
本文介绍Java自定义注解的实现原理与应用,结合Spring AOP完成日志拦截,并通过过滤器实现登录权限控制。涵盖注解定义、元注解说明及实际代码示例,适用于日志、验证、缓存等场景。
785 0
|
10月前
|
人工智能 缓存 算法
为什么你学了那么多算法,代码性能还是“一塌糊涂”?
本文针对开发者普遍存在的“学了算法却写不出高性能代码”的痛点,提供了一套系统化的“算法优化AI指令”。该指令旨在引导开发者建立“分析-设计-验证”的工程化思维,通过结构化的提问框架,让AI成为辅助性能优化的“私人教练”,从而将零散的算法知识转化为体系化的实战能力。
463 7
|
10月前
|
Java Shell Apache
Jmeter快速入门
本文介绍JMeter的安装与快速入门,包括下载、解压、运行步骤及中文界面设置方法,并演示创建线程组、添加HTTP取样器和查看测试结果的基本操作流程。
289 0
|
10月前
|
SQL 安全 网络协议
常见的网络攻击
恶意软件、网络钓鱼、中间人攻击、DDoS攻击、SQL注入、零日漏洞及DNS隧道是常见网络安全威胁。恶意软件通过漏洞入侵,窃取数据或破坏系统;网络钓鱼伪装可信来源骗取信息;MitM攻击窃听通信;DDoS以海量流量瘫痪服务;SQL注入操控数据库;零日攻击利用未修复漏洞;DNS隧道则隐藏恶意数据传输,严重威胁网络安全。
205 0