当前位置: 首页 > news >正文

实名认证次数限制

在业务层实现实名认证次数限制

这个功能是通过以下步骤实现实名认证的次数限制:

  1. 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。
  2. 失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。
  3. 成功认证后的限制:一旦用户成功完成实名认证,他们将在一段时间内不能重复认证。

技术栈

  • Spring Boot:作为项目的基础框架。
  • Redis:用于存储认证状态和计数器。

实现细节

1. 每日失败尝试次数限制

为了限制用户每天可以尝试失败的次数,需要在Redis中存储每个用户的失败尝试次数,并确保每天午夜重置这些计数器。

代码示例
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;@Service
public class RealNameAuthService {private static final String DAILY_FAIL_COUNT_KEY_PREFIX = "real_name_auth_fail_count:";private static final int MAX_DAILY_FAIL_ATTEMPTS = 5; // 最大失败次数@Autowiredprivate StringRedisTemplate redisTemplate;public boolean checkDailyFailCount(String userId) {LocalDate today = LocalDate.now();String key = DAILY_FAIL_COUNT_KEY_PREFIX + userId + ":" + today;String failCountStr = redisTemplate.opsForValue().get(key);int failCount = !StringUtils.hasText(failCountStr) ? 0 : Integer.parseInt(failCountStr);if (failCount >= MAX_DAILY_FAIL_ATTEMPTS) {return false; // 达到最大失败次数}redisTemplate.opsForValue().increment(key, 1);redisTemplate.expireAt(key, Date.from(today.plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant()));return true;}
}

2. 失败后的冷却时间

为了确保在失败尝试之后有一定的冷却时间,可以在Redis中设置失败尝试计数器的过期时间。

代码示例
private static final long COOL_DOWN_PERIOD = 5 * 60 * 1000; // 冷却时间(毫秒)public boolean checkCoolDownPeriod(String userId) {String key = DAILY_FAIL_COUNT_KEY_PREFIX + userId;Long failCount = redisTemplate.opsForValue().increment(key, 1);if (failCount > MAX_DAILY_FAIL_ATTEMPTS) {redisTemplate.expire(key, COOL_DOWN_PERIOD, TimeUnit.MILLISECONDS);return false; // 需要等待冷却时间}return true;
}

3. 成功认证后的限制

为了限制用户成功认证后的重复尝试,在Redis中存储一个标志位来记录认证的状态。

代码示例
private static final String SUCCESS_AUTH_KEY_PREFIX = "real_name_auth_success:";
private static final long SUCCESS_LIMIT_DURATION = 24 * 60 * 60 * 1000; // 一天(毫秒)public boolean checkSuccessAuth(String userId) {String key = SUCCESS_AUTH_KEY_PREFIX + userId;Boolean isAuthed = redisTemplate.hasKey(key);if (isAuthed) {return false; // 已经认证过}redisTemplate.opsForValue().set(key, "true", SUCCESS_LIMIT_DURATION, TimeUnit.MILLISECONDS);return true;
}

4. 整合以上功能

整合上述功能到一个统一的方法中,以便在实名认证过程中调用。

代码示例
public boolean authenticateRealName(String userId, String name, String idNumber) {if (!checkDailyFailCount(userId)) {return false;}if (!checkCoolDownPeriod(userId)) {return false;}// 这里可以添加具体的实名验证逻辑boolean isAuthenticated = verifyRealName(name, idNumber);if (isAuthenticated) {if (!checkSuccessAuth(userId)) {return false;}// 成功认证后,可以清除失败计数器redisTemplate.delete(DAILY_FAIL_COUNT_KEY_PREFIX + userId);}return isAuthenticated;
}

结论

通过以上步骤,可以在业务层实现实名认证次数的限制,包括每日失败尝试次数的限制、失败后的冷却时间以及成功认证后的限制。这种方法简单且易于维护,适合大多数应用场景。

相关文章:

实名认证次数限制

在业务层实现实名认证次数限制 这个功能是通过以下步骤实现实名认证的次数限制: 每日失败尝试次数限制:限制用户每天可以尝试失败的次数。失败后的冷却时间:用户在连续失败几次后需要等待一段时间才能再次尝试。成功认证后的限制&#xff1…...

【如何在Python中使用pathlib模块】

在Python中使用pathlib模块主要涉及创建Path对象,并利用这些对象提供的方法来执行文件系统的各种操作。以下是一些详细的步骤和示例,帮助你了解如何在Python中有效地使用pathlib模块。 1. 导入Path类 首先,从pathlib模块中导入Path类。 fr…...

sqli-labs第一关详细解答

首先判断是否有注入点 发现and 11 和 and 12结果一样,所以应该是字符型注入,需要对单引号做闭合 做闭合后发现报错,提示Limit 0,1,那就说明存在注入点,但是要注释掉后面的limit 0,1 使用--注释掉limit 0,1后&#xff…...

分布式事务一站式解决方案-Seata

分布式事务一站式解决方案- 分布式事务一站式解决方案分布式事务产生背景三个概念Seata下载和安装实际业务模拟演示不加 GlobalTransactional 注解,正常操作下单不加 GlobalTransactional 注解,下单过程出异常或者超时了加 GlobalTransactional 注解&…...

openwrt 使用ftace工具追踪协议栈转发流程

开这四个宏 CONFIG_KERNEL_DYNAMIC_FTRACEy CONFIG_KERNEL_FTRACEy CONFIG_KERNEL_FUNCTION_GRAPH_TRACERy CONFIG_KERNEL_FUNCTION_TRACERy 如果/sys/kernel/debug/tracing没有,可以挂载 mount -t debugfs nodev /sys/kernel/debug 挂载报错: mo…...

ElasticSearch优化实战:打造高性能搜索引擎的秘籍

在当今这个大数据时代,信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息,还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎,因其强大的全文搜索…...

【STL】| C++ 栈和队列(详解、容器适配器的初步引入)

目录 前言 总代码 容器适配器的引入 栈 stack 队列 queue 栈和队列用法简介 栈 队列 deque简介(了解即可) 结语 前言 今天我们要讲解的结构是栈和队列 这两个的具体实现相比于前面我们学的string、vector、list都要简单得多(因为容…...

xss漏洞(二,xss靶场搭建以及简单利用)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …...

深度学习--------------Kaggle房价预测

目录 下载和缓存数据集访问和读取数据集总代码 数据预处理训练K折交叉验证模型选择总代码提交你的Kaggle预测提交Kaggle 下载和缓存数据集 import hashlib import os import tarfile import zipfile import requests# download传递的参数分别是数据集的名称、缓存文件夹的路径…...

cpio 命令

前言 cpio(Copy In and Out)是一种在类 Unix 操作系统中处理归档文件的多功能工具。与 tar 不同,cpio 有其独特的优势和使用场景,特别是在与其他命令结合使用时。本文将带你了解 cpio 的基础知识、用法及实际示例。 什么是 cpio…...

TreeMap自定义排序

我们都知道TreeMap可以根据key按字典升序排序。但在某些场景下,我们需要自定义排序规则,为了代码优雅一些,我们也希望在stream中groupingBy时自定义排序规则,就可以参考本文的实现。 1. 使用TreeMap默认的排序规则(按…...

我的CSDN 512天创作纪念日-20240807

机缘 在 2023 年 3 月 13 日,我撰写了第一篇技术博客《软考高级-系统分析师-案例分析-系统维护与设计模式》。那一天,我决定将自己的实战项目经验和学习心得记录下来,与更多志同道合的朋友分享。成为一名专业 IT 作者的梦想,促使我…...

微服务-实现nacos的集群和Gateway网关的实现、认证校验、解决跨域

1. nacos的集群模式 1.1 分析 nacos在企业中的使用100%都是集群模式。需要掌握nacos集群的搭建 nacos的数据存放在derby本地磁盘中,nacos集群模式会导致数据库数据不一致,使用加一层思想,修改nacos的数据库,使用mysql数据库&…...

数据库中的约束,聚合函数以及联合查询

目录 数据库中的约束 not null unique default primary key foreign key 表的设计 聚合函数(查询) 分组 联表查询(多表查询) 内连接 外连接 左外连接 右外连接 自连接 子查询 合并查询 数据库中的约束 为了保证…...

【AI大模型】Ollama+OpenWebUI+llama3本地大模型

本地部署大模型 0.引言1.部署安装1.1部署工具1.2 概念介绍1.3 ollama安装后的基本使用1.4 大模型权重下载1.4.1 ollama在线下载1.4.2 huggingFace下载大模型权重及如何使用ollama进行调用 2.带有UI界面的使用3.参考 0.引言 (1)目的 本教程主要关于开源A…...

习题20240807

文章目录 题目 1: 泛型类题目 2: 泛型方法题目 3: 泛型接口题目 4: 泛型约束题目 5: 泛型集合题目6:题目7:题目8:题目9: 题目 1: 泛型类 编写一个泛型类 Box,它能够存储一个类型为 T 的值,并提供方法 SetI…...

src挖掘-记一次有趣的逻辑漏洞分享

漏洞挖掘-记一次有趣的逻辑漏洞挖掘 前言简述1、信息收集2、找功能点3、挖掘漏洞案例一:任意用户注册漏洞案例二-垂直越权导致管理员密码重置获得管理员后台权限漏洞总结 前言 此文章是小白的学习笔记,请不要利用文章内相关知识点进行非法渗透&#xff…...

【C++】STL | list (链表)详解及重要函数的实现

目录 前言 总代码 ListNode类框架的建立 (成员与模板) list类的框架 普通构造 与 empty_init(适合不同类型构造函数的小函数) list的迭代器 引子 operator、operator--(前置与后置) operator 与 operator! operator* 与 …...

警惕智能手机的“隐形眼”:如何保护我们的数字隐私堡垒

随着智能手机深入我们生活的方方面面,它变得无所不在,甚至无所不知。 但你是否意识到,你的手机可能正在悄无声息地“监听”你的一举一动? 从你的搜索习惯到日常对话,手机的个性化推荐系统正不断收集你的数据。 本文…...

人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程12-自然语言处理之NLP的语言模型-ELMo,transformer,BERT与代码详解。本课程面向高级人工智能算法工程师,深入讲解自然语言处理(NLP)中的关键语言模型技术,包括了EMLo和transformer架构。此外,课程还详细…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...