0to1使用Redis实现“登录验证”次数限制

2024-09-07 07:52

本文主要是介绍0to1使用Redis实现“登录验证”次数限制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 引言

系统为了避免密码遭到暴力破解,通常情况下需要在登录时,限制用户验证账号密码的次数,当达到一定的验证次数后,在一段时间内锁定该账号,不再验证。本章将用几行代码实现该功能,完整代码链接在文章最后。

2 原理介绍

可以看到在登录接口中,4行代码即可实现该功能,这里使用Redis可以很方便的记录“登录失败次数”,以及设置其失效时间(即锁定时间),主要步骤是:

  1. 账号登录时,当前账号“登录失败次数”默认+1。
  2. 设置“登录失败次数”失效的时间(即锁定时间)。
  3. 当“登录失败次数”大于某个阈值时,就直接返回错误提示,不再走验证逻辑。
  4. 账号登录成功,清除“登录失败次数”,重新计数。

注意:第2步和第3步,可以交换顺序。
第2步在前时,锁定中发起请求会导致重新计时。
第3步在前时,锁定中发起请求不会导致重新计时。

在这里插入图片描述

3 代码

isTrue是断言方法,不满足条件时,抛出异常,在全局异常处理中,统一返回错误提示。参见Spring全局异常处理HandlerExceptionResolver使用。

package com.zeroone.service.sys;import com.zeroone.common.RedisKey;
import com.zeroone.entity.sys.User;
import com.zeroone.service.BaseService;
import com.zeroone.utils.Param;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service("UserService")
public class LoginServiceImpl extends BaseService implements LoginService {@Overridepublic Object webLogin(Param info) {String account = info.getStringNotNull("account").trim();String password = info.getStringNotNull("password").trim();Long loginFailedCount = redisTemplate.opsForValue().increment(RedisKey.LOGIN_FAILED_COUNT + account, 1);//先将登录失败次数+1redisTemplate.expire(RedisKey.LOGIN_FAILED_COUNT + account, 10, TimeUnit.SECONDS);// 指定登录失败次数失效时间isTrue(loginFailedCount <= 5, "请10秒后重试!");//当登录失败次数大于阈值后,直接返回错误信息//TODO 模拟验证密码isTrue(password.equals("12345"), "账号或密码错误,还能重试" + (5 - loginFailedCount) + "次!");redisTemplate.delete(RedisKey.LOGIN_FAILED_COUNT + account);// 验证通过后,清除登录失败次数User user = new User();user.setId(1L);user.setName("张三");user.setAccount("12345678901@qq.com");user.setPhone("12345678901");String token = tokenService.createToken(user);return token;}@Overridepublic void logout() {tokenService.deleteToken();}
}
    /*** true断言** @param expression 参数* @param msg        描述*/public void isTrue(boolean expression, String msg) {if (!expression) {throw new MyRuntimeException(HttpCode.BAD_REQUEST_CODE, msg);}}

4 测试

  1. 启动项目,请求:http://localhost:8080/web/login,输入错误的密码,提示"账号或密码错误,还能重试X次!"。

在这里插入图片描述
2. 然后连续验证错误5次后,提示"请10秒后重试!",表示该账号被锁定,拒绝验证,且10秒内无法再次请求验证。
在这里插入图片描述

5 完整代码

Gitee代码链接

这篇关于0to1使用Redis实现“登录验证”次数限制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144495

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法