一、为啥使用redis来限制密码输入次数
使用mysql等关系型数据库也可以完成禁用,但是没有定时的功能,而redis数据库自带的定时删除功能。
二、实现思路
用户输入密码错误后,就自动在redis数据库中增加一条数据,数据内容为key+value,key是用户名,value是错误次数,每次出错,更新value,直到value等于3,给这个键值对加上失效时间即可。
登陆的时候需要判断用户的value是否为3,如果为3查出失效时间返回给前台
三、代码实现
只拿出service层的代码:
/** * @author: wsq * @Date: 2020/7/22 12:30 * @Description: 用户登陆模块,三次输入错误禁用2小时 */ public String login(Map<String, Object> map){ // 判断该账号是否存在 Map<String, Object> admin = redisMapper.login(map); if(admin == null){ return "此账号不存在!"; } // 判断账号是否已经禁用 int failCount = 0; if(redisTemplate.opsForValue().get(map.get("account").toString()+"FailCount") != null){ failCount = Integer.parseInt(redisTemplate.opsForValue().get(map.get("account").toString()+"FailCount").toString()); } if(failCount == 3){ long lockTime = redisTemplate.getExpire(map.get("account").toString()+"FailCount"); return "此账号已被禁用,禁用剩余时间为:"+lockTime+"秒"; } // 判断用户名密码是否正确 if (!(admin.get("password").toString().equals(map.get("password").toString()))){ redisTemplate.opsForValue().set(map.get("account")+"FailCount",++failCount); if(failCount == 3){ redisTemplate.opsForValue().set(map.get("account")+"FailCount",failCount,60*60*2, TimeUnit.SECONDS); return "此账号已被禁用,禁用时间为2个小时!"; } return "输入密码错误,请重新输入,你可以再次尝试的次数为:"+ (3 - failCount); } return "登陆成功"; }
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:StringBoot+redis-用户登陆限制密码输入次数(超出后禁用两个小时) - Python技术站