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;

}

}

}

相关推荐
LuckyLay1 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
易云码11 分钟前
信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)
数据库·物联网·安全·web安全·低代码
向阳121814 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
newxtc17 分钟前
【客观理性深入讨论国产中间件及数据库-科创基础软件】
数据库·中间件·国产数据库·国产中间件·科创
水月梦镜花19 分钟前
redis:list列表命令和内部编码
数据库·redis·list
Gu Gu Study24 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
MonkeyKing_sunyuhua1 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql