0.背景
文章背景:为了防止用户暴力破解用户名和密码,一般的系统都有限制。比如说,密码错误几次就限制登陆几分钟这样。这篇文章主要就是研究实现并解决次问题。
网上其实有一堆成型的框架或登陆系统都集成了这个功能,本文是在实际操作中发发现自研系统的一个弊端(当一个用户登陆失败次数过多被限制登陆时,所有用户都被限制登陆了)
本文用到的技术:Spring MVC+redis+postman
1.简单的实现过程
设计的流程图如下:
- 首先,第一步,用户访问登录接口,首先去redis中查找当前用户的信息,如果没有就在redis中新增一份当前登录的信息,包含以下属性:
userName:用户名
retryCount:错误次数(满5次就归零,同时sum更新)
ctTime:登录时间(当前时间)
loginPermit:当前用户是否允许登录(默认允许登录)
sum:错误次数(默认是0)
如果查找到当前用户信息,线看看sum的值,根据sum的值判断返回不允许登录的时间。
这一步着重校验一下,系统当前的时间与当前用户存在redis中的上一个登录的时间+不允许登录的时间和。时间不允许就继续保持原来时间,时间允许就更新当前登录时间。
2. 上一步返回登录限制时间以后,时间不为0说明有限制登录的时间,也就是在某个时间内不允许登录。
3. 开始登录接口,登录成功后,开始更新redis中的用户消息,主要把登录次数retryCount重置为0,cTime变成当前时间,loginPermit为允许登录,sum重置为0。
如果登录失败,retryCount++ ,如果retryCount满五次则更新sum,每次更新sum则登录时间依次变成 1分钟、5分钟、10分钟、15分钟。