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;

}

}

}

相关推荐
Mr.1318 分钟前
数据库的三范式是什么?
数据库
禁默18 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood25 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑27 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
gb421528730 分钟前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶31 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Python之栈32 分钟前
【无标题】
数据库·python·mysql
zfoo-framework38 分钟前
【jenkins插件】
java
风_流沙44 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch