当前位置:网站首页>用户密码验证
用户密码验证
2022-08-03 04:35:00 【Dzooooone_】
密码的验证-锁定
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.google.common.collect.Maps;
import com.inesa.basic.business.server.service.BasicUserInfoService;
import com.inesa.business.model.AuthorityResponse;
import com.inesa.business.model.BasicUserInfoVo;
@Component
public class AuthorityTools {
@Resource
private BasicUserInfoService userService;
/**
* 允许的最大登录次数
*/
@Value("${authority.retry.limit:3}")
private int retryLimit;
/**
* 用户锁定时间
*/
@Value("#{${authority.retry.lock:5} * 60 * 1000L}")
private long lockTime;
/**
* 用户登录锁定时间
*/
private Map<Long, Long> userLockTime = Maps.newConcurrentMap();
/**
* 用户登录失败次数
*/
private Map<Long, Integer> userLongTime = Maps.newConcurrentMap();
/**
* 对信息进行加密
*
* @param
* @return
*/
public String encoder(String password) {
return CryptoUtil.encrypt(password);
}
/**
* 验证是否正确
*
* @param username
* @param password 第几次登录
* @return
*/
public AuthorityResponse authority(String username, String password) {
BasicUserInfoVo user = userService.findByUserName(username);
// 验证用户是否存在
if (user == null) {
return AuthorityResponse.builder().check(false).error("用户不存在").build();
}
// 判断用户是否锁定
if (userLockTime.containsKey(user.getId())) {
if (System.currentTimeMillis() - userLockTime.get(user.getId()) < lockTime) {
if (userLongTime.getOrDefault(user.getId(), 0) > retryLimit) {
int minutes = (int) ((System.currentTimeMillis() - userLockTime.get(user.getId())) / 60000L);
return AuthorityResponse.builder().check(false)
.error(String.format("用户已锁定,请在%s分钟后重试", lockTime / 60000L - minutes)).build();
}
} else {
// 如果上次登录失败的时间已经超过时间限制,重置登录失败的次数
userLockTime.remove(user.getId());
userLongTime.remove(user.getId());
}
}
if (user.getState() == BasicUserInfoVo.DISABLE) {
return AuthorityResponse.builder().check(false).error("用户已被禁用").build();
}
if (user.getState() == BasicUserInfoVo.LOCKED) {
return AuthorityResponse.builder().check(false).error("用户已被锁定").build();
}
// 验证密码是否不正确
if (!password.equals(user.getPassword())) {
// 登录失败后更新登录失败的次数,以及更新登录失败的时间
int retriedTimes = userLongTime.getOrDefault(user.getId(), 0);
retriedTimes++;
userLongTime.put(user.getId(), retriedTimes);
userLockTime.put(user.getId(), System.currentTimeMillis());
return AuthorityResponse.builder().check(false)
.error("密码错误").build();
}
return AuthorityResponse.builder().userId(user.getId()).check(true).build();
}
}
边栏推荐
- 【生物素叠氮化物|cas:908007-17-0】价格_厂家
- 汇编题答案
- 移动流量的爆发式增长,社交电商如何选择商业模式
- path development介绍
- JS底层手写
- Technology Sharing | How to do assertion verification for xml format in interface automation testing?
- Interface test framework combat (1) | Requests and interface request construction
- 接口测试框架实战(二)| 接口请求断言
- 计组错题集
- 【Harmony OS】【ARK UI】ETS 上下文基本操作
猜你喜欢
随机推荐
Online password generator tool recommendation
Kotlin-Flow common encapsulation class: the use of StateFlow
移动流量的爆发式增长,社交电商如何选择商业模式
接口测试框架实战(一) | Requests 与接口请求构造
Kotlin-Flow常用封装类:StateFlow的使用
13.机器学习基础:数据预处理与特征工程
5.回顾简单的神经网络
技术分享 | 接口自动化测试中如何对xml 格式做断言验证?
flink sql任务变更,在sql里面增加几个字段后,从以前保存的savepoint恢复启动出错。
IDEC和泉触摸屏维修HG2F-SS22V HG4F软件通信分析
计组错题集
path development介绍
社交电商:链动2+1模式,为什么能在电商行业生存那么久?
【Harmony OS】【FAQ】Hongmeng Questions Collection 1
easyswoole的mysqli 事务怎么写
【软件工程之美 - 专栏笔记】35 | 版本发布:软件上线只是新的开始
JS底层手写
The flink sql task is changed, and after adding several fields to the sql, an error occurs when restoring from the previously saved savepoint.
【Harmony OS】【ArkUI】ets开发 基础页面布局与数据连接
2022/08/02 学习笔记 (day22) 多线程