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

目录
相关文章
|
6月前
|
人工智能 前端开发 JavaScript
告别"玄学调试":用这份指令让AI成为你的"赛博华佗"
调试占用了开发者50%的时间?本文提供一套专业的AI调试指令,将大模型转化为"拥有10年经验的代码医生"。通过结构化的诊断-修复-预防流程,告别低效的"玄学调试",实现从"修好Bug"到"根治隐患"的质变。
538 6
|
6月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是成熟的安全框架,提供认证、鉴权及防御攻击功能。支持多种认证方式,如OAuth2、JWT、表单等,基于过滤器链实现安全控制,通过SecurityFilterChain管理多组过滤规则,并利用ExceptionTranslationFilter处理安全异常,保障Web应用安全。
92 0
|
6月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细介绍Nacos作为配置中心的实现原理与实战步骤,涵盖配置管理、热更新、共享配置优先级及集群搭建,帮助微服务应用实现配置动态化、高可用部署。
358 4
|
6月前
|
存储 NoSQL 关系型数据库
MongoDB相关概念
MongoDB是一款高性能、无模式的文档型NoSQL数据库,适用于高并发、海量数据、高可用场景。它以BSON格式存储数据,支持嵌入式文档、丰富查询、索引优化及水平扩展,广泛应用于社交、游戏、物联网等领域,具备高扩展性、高可用性与灵活的数据模型。
113 8
MongoDB相关概念
|
6月前
|
存储 缓存 Java
自定义注解
本文介绍Java自定义注解的实现原理与应用,结合Spring AOP完成日志拦截,并通过过滤器实现登录权限控制。涵盖注解定义、元注解说明及实际代码示例,适用于日志、验证、缓存等场景。
468 0
|
6月前
|
人工智能 算法 架构师
你的团队是"精锐特种兵",还是"草台班子"?就差这一份"源代码"
针对技术团队管理混乱、过度依赖个人的痛点,提出用AI指令将经验转化为标准SOP的解决方案。通过工程化思维重构管理流程,实现团队经验的"开源"与"复用",释放核心人才价值。
457 10
|
8月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
701 1
|
机器学习/深度学习 人工智能 安全
Stable Diffusion 3.0 :一键开启你的AI绘画之旅
本文介绍了Stable Diffusion 3.0的主要优化,包括采用DiT架构提升多对象生成能力及“流匹配”技术加速采样。同时解决了部署复杂、显卡需求高等问题,可通过阿里云计算巢一键部署,实现即开即用。文章展示了人像、动漫风、科幻风等生成效果,并提供中文菜单设置与插件下载教程。无论是专业设计师还是普通用户,都能轻松开启智能创作新时代。 Flux模型支持即将上线,值得期待。
|
SQL 数据库连接 Shell
python连接SqlServer数据库
要使用Python连接SQL Server数据库,你需要先安装pyodbc库,然后使用它来建立连接。
797 1
python连接SqlServer数据库
|
机器学习/深度学习 编解码 算法
R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例
R语言用FNN-LSTM假近邻长短期记忆人工神经网络模型进行时间序列深度学习预测4个案例

热门文章

最新文章