当前位置:网站首页>用户密码验证
用户密码验证
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();
}
}
边栏推荐
猜你喜欢
随机推荐
Bubble sort in c language structure
Two ways to simulate multi-user login in Jmeter
安装ambari
浏览器监听标签页关闭
Browser listens for tab closing
Assembly answers
打破传统电商格局,新型社交电商到底有什么优点?
软件开发的最大的区别是什么?
Redis连接不上的报错解决方案汇总
path development介绍
unity2D横板游戏教程6-敌人AI以及受击动画
2022河南萌新联赛第(四)场:郑州轻工业大学 G - 迷宫
IDEC和泉触摸屏维修HG2F-SS22V HG4F软件通信分析
探索性测试的概念及方法
9.新闻分类:多分类问题
社交电商如何做粉丝运营?云平台怎么选择商业模式?
redis键值出现 xacxedx00x05tx00&的解决方法
普乐蛙VR台风体验馆厂家VR防震减灾模拟VR沉浸式体验设备
2022河南萌新联赛第(四)场:郑州轻工业大学 E - 睡大觉
工程制图点的投影练习









