首页 新闻 会员 周边 捐助

java 如何实现账户登录失败,错误超过一定次数进行锁定

0
[待解决问题]

需求

  1. 登录失败次数超过指定次数进行锁定,一小时后解锁
  2. 失败次数未到指定次数 ,失败次数保存
  3. 失败次数内进行成功登录清除次数
  4. 第二天清除失败次数

实现

shiro cache ,数据库 实现

问题

有没有减少数据库访问的方法,或者利用个中间件缓存是否可以操作,或着有什么更好的思路,麻烦告知一下

AtomicInteger retryCount = passwordRetryCache.get(username);
	if (null == retryCount) {
				// 获取用户失败次数  此处查询了数据库

				int num = UserUtils.selectUserLoginNum(username);
                              //此处查询了数据库
				Date lastLoginDate = UserUtils.getLastLoginDateByUserName(username);
				 
				if(null != lastLoginDate){
					long l = (System.currentTimeMillis() - lastLoginDate.getTime()) / (60 * 1000);
					//超时之后 60解锁
					if(num >= 5){
						if(l>=60){
							UserUtils.updateFailNum("0", "0", username );
						}
					}

				}
					retryCount = new AtomicInteger(num);
					passwordRetryCache.put(username, retryCount);
			}
			long lockTime = cacheManager.getCacheManager().getCache("passwordRetryCache").getCacheConfiguration().getTimeToLiveSeconds();

// passwordIsTrue 检验密码方法返回判断 stopNum 错误次数
			if(passwordIsTrue){
				if (retryCount.get() == stopNum) {
					//throw new ExcessiveAttemptsException("msg: " + username + "登陆次数超过5次");
					throw new LockedAccountException("账户被锁定,请于" + lockTime / 60 / 60 + "小时后重新登录");
				}else if(retryCount.get() > stopNum){
					throw new LockedAccountException("账户被锁定!");
				}else{
					passwordRetryCache.remove(username);
					//成功清除缓存 操作数据库
					UserUtils.updateFailNum("0","0",username);
				}
			}else{
				retryCount.incrementAndGet();
				//用来记录清除缓存后 如果有失败次数记录
				UserUtils.updateFailNum(String.valueOf(retryCount.get()),"1",username);
				if (retryCount.get() == stopNum) {
					throw new LockedAccountException("账户被锁定,请于" + lockTime / 60 / 60 + "小时后重新登录");
				}else if(retryCount.get() > stopNum){
					throw new LockedAccountException("账户被锁定!");
				}else{
					throw new ExcessiveAttemptsException("密码错误, 请重试.尝试登陆第: " + retryCount.get() + "次,您还有"+(5 - retryCount.get())+"次机会");
				}
			}
知所以然的主页 知所以然 | 菜鸟二级 | 园豆:202
提问于:2021-12-16 23:55
< >
分享
所有回答(2)
0

可以用redis,记录失败次数什么的很方便,完全可以代替你的数据库操作,至于第二天清零,可以通过定时任务来处理

不想输入手机号和邮箱 | 园豆:206 (菜鸟二级) | 2021-12-17 17:34

好的,我这就去 操作下

支持(0) 反对(0) 知所以然 | 园豆:202 (菜鸟二级) | 2021-12-19 00:39
0

Redis 就可以了,设置过期时间

A股天才交易猿 | 园豆:1542 (小虾三级) | 2021-12-19 20:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册