Redis 实现 用户输入密码错误5次锁定

/**

* 判断用户账号是否被锁定,及超时时间

*/

@Service

@Slf4j

public class LoginService {

@Resource

private RedisTemplate<String, Object> redisTemplate;

private static final int MAX_LOGIN_ATTEMPTS = 5;

private static final String ACCOUNT_PREFIX = "account:";

private static final String LOCKED_KEY_SUFFIX = ":locked";

private static int LOCK_DURATION_MINUTES = 15;

public boolean validateLogin(String username, boolean flag) {

String accountKey = ACCOUNT_PREFIX + username;

String lockedKey = accountKey + LOCKED_KEY_SUFFIX;

if (redisTemplate.hasKey(lockedKey)) {//判断是否存在锁定账号

// 账号已被锁定,获取过期剩余时间

long unlockTimestamp = redisTemplate.getExpire(lockedKey, TimeUnit.SECONDS);

if (unlockTimestamp>0) {

// 还未解锁,拒绝登录

throw exception(AUTH_LOGIN_USER_LOCK,(unlockTimestamp/60));

} else {

// 解锁时间已过,移除锁定状态

redisTemplate.delete(lockedKey);

}

}

if (!flag) {

// 密码错误

Long loginAttempts = redisTemplate.opsForValue().increment(accountKey, 1);

if (loginAttempts >= MAX_LOGIN_ATTEMPTS) {

// 达到锁定阈值,锁定账号

// 设置 key 为 test 的值,并设置超时时间为 15 分钟

redisTemplate.opsForValue().set(lockedKey, lockedKey, LOCK_DURATION_MINUTES, TimeUnit.MINUTES);

}

return false;

} else {

// 密码正确,重置错误计数器

redisTemplate.delete(accountKey);

return true;

}

}

}

相关推荐
大圣编程13 分钟前
Java 多维数组详解
java·开发语言
万法若空3 小时前
【算法-查找】查找算法
java·数据结构·算法
阿成学长_Cain3 小时前
Linux ipcs 命令超全详解:查看共享内存 / 消息队列 / 信号量,IPC 运维必备
linux·运维·服务器·网络·数据库
HZZD_HZZD5 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
OceanBase数据库官方博客5 小时前
OceanBase AI 时代,数据库的变与不变(技术解析与实践)
数据库·人工智能·oceanbase
阿成学长_Cain7 小时前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
ywl4708120877 小时前
Mysql 平衡二叉树、红黑树、B树、B+树区别以及应用场景(五)
数据库·b树·mysql
山登绝顶我为峰 3(^v^)37 小时前
C/C++ 交叉编译方法
java·c语言·c++
IvorySQL7 小时前
IvorySQL Agent 探索与实践
数据库·人工智能·postgresql·oracle·ivorysql