SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)

点击下载《SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)》

1. 引言

在当今的网络环境中,保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击,我们需要在用户尝试登录失败一定次数后限制其登录。这不仅可以保护用户的账户安全,还可以减轻服务器的压力。在本文中,我们将使用Spring Boot和Redis来实现这个功能。

在这里插入图片描述

2. 系统设计

首先,我们需要一个系统来跟踪用户的登录尝试。由于我们的系统需要处理大量的用户请求,所以我们需要一个快速、可靠的存储系统来存储这些信息。Redis是一个内存中的数据结构存储,它可以提供高速的读写操作,非常适合我们的需求。

我们的系统将使用Redis的哈希数据类型来存储每个用户的登录尝试信息。哈希中的每个字段表示一个尝试的计数器,而字段的值则表示尝试的次数。当用户尝试登录时,我们会增加相应的计数器。如果计数器的值超过了设定的限制,我们将阻止用户在设定的时间内再次尝试登录。

3. 实现细节

3.1 添加依赖

首先,我们需要在Spring Boot项目中添加Redis的依赖。在pom.xml文件中添加以下依赖:

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId>  
</dependency>

3.2 配置连接信息

然后,我们需要在application.properties文件中配置Redis的连接信息:

spring.redis.host=your_redis_host  
spring.redis.port=your_redis_port

3.3 连接Redis

接下来,我们需要创建一个RedisTemplate来连接Redis:

@Bean  
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {  RedisTemplate<String, Object> template = new RedisTemplate<>();  template.setConnectionFactory(factory);  return template;  
}

3.4 创建RedisService

然后,我们需要创建一个RedisService来处理与Redis的交互:

@Service  
public class RedisService {  @Autowired  private StringRedisTemplate redisTemplate;  public void incrementKey(String key) {  redisTemplate.opsForValue().increment(key, 1);  }  public long getKey(String key) {  return redisTemplate.opsForValue().get(key);  }  
}

3.5 创建UserController

现在,我们可以在UserController中实现登录功能:

@RestController  
public class UserController {  @Autowired  private UserService userService;  @Autowired  private RedisService redisService;  @Autowired  private AuthenticationManager authenticationManager;  @PostMapping("/login")  public ResponseEntity<?> login(@RequestBody User user) {  // 检查用户名和密码是否正确  if (userService.checkUser(user.getUsername(), user.getPassword())) {  // 检查用户是否被阻止登录  long attempts = redisService.getKey("login_attempts_" + user.getUsername());  if (attempts >= 3) {  // 用户尝试登录次数超过3次,阻止用户登录一定时间(例如30分钟)  redisService.incrementKey("login_attempts_" + user.getUsername()); // 增加尝试次数计数器(在一定时间后过期)  return ResponseEntity.status(HttpStatus.FORBIDDEN).body("You have exceeded the maximum login attempts. Please wait for 30 minutes and try again.");  } else {  // 用户没有被阻止登录,允许他们登录并重置尝试次数计数器(在一定时间后过期)  redisService.set("login_attempts_" + user.getUsername(), 0, 30, TimeUnit.MINUTES); // 设置计数器在30分钟后过期(例如30分钟)  userService.loginUser(user); // 允许用户登录并重置尝试次数计数器(在一定时间后过期)  return ResponseEntity.status(HttpStatus.OK).body("Login successful.");  }  } else {  // 如果用户名和密码不正确,增加尝试次数计数器并返回错误信息给用户。如果用户已经被阻止登录,则返回错误信息给用户。否则,允许用户再次尝试登录。重复这个过程直到用户成功登录或被阻止登录。  redisService.incrementKey("login_attempts_" + user.getUsername()); // 增加尝试次数计数器  return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password.");  }  }  
}

4. 测试与验证

为了验证我们的系统是否正常工作,我们需要编写一些测试用例。我们可以使用JUnit和MockMvc进行测试。以下是一个简单的测试用例,用于测试登录功能:

@RunWith(SpringRunner.class)  
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)  
public class UserControllerTest {  @Autowired  private WebApplicationContext context;  @Autowired  private UserService userService;  @Autowired  private RedisService redisService;  private MockMvc mockMvc;  @Before  public void setup() {  mockMvc = MockMvcBuilders.webAppContextSetup(context).build();  }  @Test  public void testLoginSuccess() throws Exception {  mockMvc.perform(post("/login")  .contentType(MediaType.APPLICATION_JSON)  .content("{\"username\":\"test\",\"password\":\"test\"}"))  .andExpect(status().isOk());  long attempts = redisService.getKey("login_attempts_" + "test");  assertEquals(0, attempts); // 确保尝试次数计数器被重置为0  }  @Test  public void testLoginFailureAndBlock() throws Exception {  mockMvc.perform(post("/login")  .contentType(MediaType.APPLICATION_JSON)  .content("{\"username\":\"test\",\"password\":\"test\"}"))  .andExpect(status().isOk());  mockMvc.perform(post("/login")  .contentType(MediaType.APPLICATION_JSON)  .content("{\"username\":\"test\",\"password\":\"test\"}"))  .andExpect(status().isForbidden()); // 用户被阻止登录,返回403错误  long attempts = redisService.getKey("login_attempts_" + "test");  assertEquals(3, attempts); // 确保尝试次数计数器被设置为3,表示用户已被阻止登录  }  
}

5. 总结

总结一下SpringBoot + Redis实现用户连续输入多次密码错误后限制登录的原理和作用如下:

  • 原理:

    • 当用户尝试登录时,系统会检查Redis中是否存在该用户的登录尝试记录。

    • 如果记录存在,则判断用户连续输入密码错误的次数,并根据设定的阈值决定是否限制用户登录。

    • 如果达到阈值,则在Redis中设置一个标志位,表示该用户已被限制登录。

    • 在限制期间内,系统将拒绝该用户的登录请求。

    • 限制时间过后,系统将自动解除对该用户的限制。

  • 作用:

    • 增强系统安全性:通过限制用户连续输入密码错误的次数,可以防止暴力破解攻击,保护用户账户安全。

    • 提高用户体验:对于因连续输入密码错误而被限制登录的用户,系统会给出相应的提示信息,引导用户重置密码或找回账号,避免用户因多次尝试而产生挫败感。

    • 防止恶意行为:对于恶意尝试登录的用户,系统可以实施限制登录的策略,有效地遏制了其不良行为。

    • 优化服务器性能:通过Redis实现用户登录限制,可以减轻服务器的压力,提高系统的性能和稳定性。

点击下载《SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/250480.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机学习笔记 --步进电机驱动说明

文章目录 工作原理代码编写驱动方式全步进驱动半步进驱动微步进驱动 工作原理 工作原理简要说明&#xff0c;和单片机一起配合使用的步进电机多为28BYJ28 五线四相步进电机&#xff0c;配合ULN2003驱动板进行控制&#xff0c;如图所示&#xff0c;对于扭矩、精度要求较高的还有…

如何手机搜中国大学mooc答案?推荐9个搜题软件和学习工具 #经验分享#其他

以下软件拥有强大的搜索功能&#xff0c;能够快速找到与题目相关的资料和答案&#xff0c;让大学生们更容易理解和掌握知识点。 1.Google翻译 可提供简体中文和另外 100 多种语言之间的互译功能&#xff0c;可让您即时翻译字词、短语和网页内容 Google的免费翻译服务 2.大鱼…

嵌入式软件中常见的 8 种数据结构

数据结构是一种特殊的组织和存储数据的方式&#xff0c;可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外&#xff0c;数据结构属于计算机科学和软件工程的基础。当…

C语言之位段练习

一、题目 下面代码的运行结果为&#xff1f; int main() {unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData (struct tagPIM*)puc;memset(puc,0,4);pstPi…

Unity_使用Shader实现玻璃和镜面效果

效果图如下&#xff1a; 玻璃效果图 镜面效果图 Step1 搭建场景→镜子使用Quad代替&#xff0c;放置在需要反射的墙面→创建新的材质和Shader Step2 墙壁外创建Camera&#xff0c;用来渲染物体后方的视图→创建RenderTexture&#xff0c;赋于该相机 Step3 Shader的编写如下…

​(三)hadoop之hive的搭建1

下载 访问官方网站https://hive.apache.org/ 点击downloads 点击Download a release now! 点击https://dlcdn.apache.org/hive/ 选择最新的稳定版 复制最新的url 在linux执行下载命令 wget https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz 2.解压…

Visual Studio 2022 查看类关系图

这里写自定义目录标题 右键要查看的项目 -“查看”-“查看类图”效果展示&#xff1a; 原文地址 www.cnblogs.com 步骤1&#xff1a;勾选扩展开发 步骤2: 勾选类设计器 右键要查看的项目 -“查看”-“查看类图” 效果展示&#xff1a;

react 之 useCallback

简单讲述下useCallback的使用方法&#xff0c;useCallback也是用来缓存的&#xff0c;只不过是用于做函数缓存 // useCallbackimport { memo, useCallback, useState } from "react"const Input memo(function Input ({ onChange }) {console.log(子组件重新渲染了…

AJAX-认识URL

定义 概念&#xff1a;URL就是统一资源定位符&#xff0c;简称网址&#xff0c;用于访问网络上的资源 组成 协议 http协议&#xff1a;超文本传输协议&#xff0c;规定浏览器和服务器之间传输数据的格式&#xff1b;规定了浏览器发送及服务器返回内容的格式 协议范围&#xf…

vue yarn certificate has expired

背景&#xff1a;我在用ant design pro框架进行初始化时&#xff0c;安装脚手架时&#xff0c;安装yarn时显示报错 原因分析&#xff1a;查了很久的资料&#xff0c;这种情况应该是开了服务器代理访问导致ssl安全证书失效了 解决办法&#xff1a; 在终端输入&#xff1a;yarn…

2023年度总结 | 关于意义,爱与回望——写给清醒又无知的20岁

Hi&#xff0c;大家好&#xff0c;我是半亩花海&#xff0c;一名再普通不过的大学生。2023年&#xff0c;20岁&#xff0c;充实而零乱的一年&#xff0c;清醒又无知的一年。年末&#xff0c;最近的一些事儿也让我逐渐地有感而发&#xff0c;心静&#xff0c;除杂&#xff0c;思…

【前端web入门第三天】02 CSS字体和文本

文章目录: 1.字体 1.1 字体大小 1.2 字体粗细 1.3 字体样式 1.4 行高 1.5 字体族 1.6 font 复合属性 2. 文本 2.1 文本缩进2.2 文本对齐方式2.3 文本修饰线2.4 color文字颜色 1.字体 1.1 字体大小 属性名: font-size属性值:文字尺寸&#xff0c;PC端网页最常用的单位px …

Python算法100例-1.2 兔子产子

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1&#xff0e;问题描述 有一对兔子&#xff0c;从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子&#xff0c;假设所有的兔子都不死&#xff0c;问30个月内每个月的兔子总对数为…

百无聊赖之JavaEE从入门到放弃(十九)容器之List

目录 一.容器简介 二.容器的结构 三.Collection接口介绍 四.List接口介绍 五.ArrayList 1.基本操作 2.索引操作 3.ArrayList的并集、交集、差集 六.Vector容器 七.LinkedList 一.容器简介 容器&#xff0c;是用来容纳物体、管理物体。生活中 , 我们会用到各种各样的…

Yalmip学习笔记

这里写自定义目录标题 基本用法变量定义关于大MBilevel programming 注&#xff1a;这篇文章主要是留给自己查漏补缺的&#xff0c;所以从来没有使用过yalmip的读者看着会觉得跳来跳去。 基本用法 建模开始前&#xff0c;使用yalmip(clear)清空Yalmip的内部数据库。 下面是一个…

回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测

回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测 目录 回归预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-B…

real-time-emotion-detection 排坑记录

real-time-emotion-detection 排坑记录 任务踩坑回顾CV2包版本问题症状描述解决方法 模型文件路径问题症状描述解决办法 tensorflow版本问题症状描述解决办法 其他 任务 我之前跑了一个CNN情绪识别的开源代码&#xff0c;现在我想尝试把他用到我的另一个项目里。但当时那个项目…

「效果图渲染」效果图与3D影视动画渲染平台

效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业&#xff0c;这些领域通常对视觉呈现的精度和细节有较高要求。与之相比&#xff0c;3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域&#xff0c;…

蓝桥杯---垒骰子

赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01;我们先来规范一下骰子&#xff1a;1的对面是4&…

arcgis javascript api4.x加载非公开或者私有的arcgis地图服务

需求&#xff1a; 加载arcgis没有公开或者私有的地图服务&#xff0c;同时还想实现加载时不弹出登录窗口 提示&#xff1a;​ 下述是针对独立的arcgis server&#xff0c;没有portal的应用场景&#xff1b; 如果有portal可以参考链接&#xff1a;https://mp.weixin.qq.com/s/W…