通常在登录密码的时候都会存在,当你的密码输错5次的时候,你的账号就好被锁定半个小时,半个小时后就自动解锁,
//获取Redis对String字符串操作对象
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
//定义 redisExist 为判断Redis中是否有此key存在
Boolean redisExist;
//验证此key是否存在
redisExist = redisTemplate.hasKey(user.getUserId() + user.getUsername());
final String errorMessage = "用户名或密码错误";
//判断是否存在用户信息
if (user == null)
throw new AuthenticationException(errorMessage);
//判断密码是否是默认密码
if (StringUtils.equals(StringConstant.DEFAULT_PASSWORD,password)) {
throw new AuthenticationException("当前用户密码为简单的默认密码,请修改后登录!");
}
//判断账号是否正确
if (!StringUtils.equals(user.getPassword(), password)) {
//判断是否存在key
if (redisExist) {
//如果redisExist 为true,则证明Redis中有此key,获取key的数值并加1;
Integer intCount = Integer.parseInt(valueOperations.get(user.getUserId() + user.getUsername()));
intCount++;
valueOperations.set(user.getUserId() + user.getUsername(),intCount+"");
}else {
//如果redistexist 为false 则证明Redis中没有此key,密码是第一次错误,故走以下逻辑
valueOperations.set(user.getUserId() + user.getUsername(),1+"");
//Redis中设置key 的过期时间
redisTemplate.expire(user.getUserId() + user.getUsername(),300, TimeUnit.SECONDS);
}
Integer count = Integer.parseInt(valueOperations.get(user.getUserId() + user.getUsername()));
//判断错误次数。是否大于或者等于5次
if(count >= 5){
//redis 中设置key的过期时间
// redisTemplate.expire(sysUser.getUserId()+sysUser.getUserName(),300, TimeUnit.SECONDS);
//更改角色状态
if (count == 5) {
//更新登录时间
this.userService.updateLoginTime(username);
user.setStatus("0");
this.userService.updateStatus(user);
throw new AuthenticationException("密码错误" + count + "次,账号被锁定30分钟,请30分钟后再尝试");
}
throw new AuthenticationException("您的账号被锁定30分钟,请30分钟后再尝试");
}else {
//提示剩余的尝试次数
Integer count1 = 5 - count;
throw new AuthenticationException("密码输入错误,请重新输入," + "密码还可以输入" + count1 + "次");
}
}else {
//通过时间搓来计算时间
int minute = (int)(DateUtils.getNowDate().getTime()-user.getLastLoginTime().getTime())/(1000*60);
// 时间大于等于30分钟的时候,解锁
if (User.STATUS_LOCK.equals(user.getStatus())) {
if (minute >= 30){
//如果通过用户名和密码的校验,则看Redis中是否有错误次数,
redisExist = redisTemplate.hasKey(user.getUserId() + user.getUsername());
if(redisExist){//如果有,则删除
redisTemplate.delete(user.getUserId() + user.getUsername());
}
//修改状态
user.setStatus("1");
this.userService.updateStatus(user);
}else {
throw new AuthenticationException(StringConstant.USERNAME_IS_CLOSED);
}
}
}