RememberMe简介及用法

简介: RememberMe功能实现用户关闭浏览器后仍保持登录状态,非简单存储账号密码。通过勾选“记住我”,服务端生成令牌并存入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 Kafka
消息中间件RabbitMQ(基础)
本章节介绍微服务架构中的消息中间件MQ,重点讲解RabbitMQ的使用。内容涵盖同步与异步通信的区别、RabbitMQ的安装与基本结构、SpringAMQP的集成与应用,以及不同交换机类型(Fanout、Direct、Topic)的消息路由机制,并通过代码示例演示消息发送与接收流程,帮助理解解耦、削峰、异步处理等核心优势。(239字)
178 0
|
3月前
|
消息中间件 Shell Linux
RabbitMQ部署指南
本文介绍了RabbitMQ的单机与集群部署方案,涵盖Docker环境下镜像安装、DelayExchange插件配置及三种集群模式(普通、镜像、仲裁队列)的实现。重点讲解了镜像模式的高可用特性与仲裁队列的自动副本管理,提升消息系统的可靠性与扩展性。
208 0
RabbitMQ部署指南
|
3月前
|
自然语言处理 Java Shell
安装ES、Kibana、IK
本文介绍如何通过Docker部署单节点Elasticsearch与Kibana,并配置IK分词器。内容涵盖网络创建、镜像加载、容器运行、插件安装及分词器扩展词典与停用词设置,同时提供常见启动报错的解决方案,助力快速搭建中文搜索环境。
171 0
|
3月前
|
存储 缓存 Java
SpringCloud(2024)
本文介绍如何在Spring项目中实现自定义注解,结合AOP与过滤器用于日志、权限控制等场景。通过@Target、@Retention等元注解定义注解,利用AOP拦截方法执行,或通过过滤器实现登录验证,提升代码可读性与复用性。
106 0
|
3月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本章深入讲解Nacos配置中心实战,涵盖配置管理、热更新、共享配置及优先级规则,并通过搭建Nacos集群实现高可用部署,结合Spring Cloud Alibaba实现微服务动态配置,提升系统可维护性与稳定性。
184 0
|
3月前
|
负载均衡 Java Nacos
Gateway服务网关
网关是微服务架构的统一入口,实现请求路由、权限控制、限流及负载均衡。SpringCloud Gateway基于WebFlux,性能优于Zuul。支持断言与过滤器工厂,可自定义全局过滤器,解决跨域等问题,是微服务流量管控的核心组件。
313 0
|
3月前
|
消息中间件 SQL API
练习
本课程作业旨在掌握Docker部署RabbitMQ、消息队列在实际场景中的应用及第三方短信API的集成。通过医嘱创建后发送短信通知的案例,学习消息生产与消费、Spring Boot整合AMQP、以及调用阿里云短信API实现通知功能,巩固微服务间异步通信与外部服务对接能力。
640 0
练习
|
3月前
|
消息中间件 存储 Unix
Mac系统安装教程
RabbitMQ 是一个开源的消息代理,实现AMQP协议,支持异步通信与解耦。具备高可靠、灵活路由、持久化等特性,广泛用于分布式及微服务架构中。
118 0
Mac系统安装教程
|
3月前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本文深入探讨RabbitMQ在生产环境中的核心问题与解决方案,涵盖消息可靠性、延迟消息、消息堆积及集群高可用等场景。通过生产者确认、持久化、消费者ACK机制保障消息不丢失;利用TTL与死信交换机实现延迟队列;借助惰性队列提升堆积处理能力;并介绍普通集群、镜像集群及仲裁队列的搭建与应用,全面提升消息中间件的稳定性与可靠性。
137 0
 消息中间件RabbitMQ(高级)
|
3月前
|
关系型数据库 MySQL Nacos
练习
本作业旨在掌握Docker部署微服务中间件及完整工程的流程,涵盖Nacos、MySQL、耗材中心、医生站与网关服务的安装、配置与验证,通过Dockerfile和docker-compose实现多服务协同运行。