一 限制登录实践
设计思路
1.0 背景
最近在开发辽事通机构开放管理平台入驻功能模块功能。
该模块涉及到注册、登录、入驻等功能。
涉及到的技术有SpringBoot、Mybatis、Spring Security、Jwt、Npm、vue-cli、vue-router、vuex、element-ui
1.1 思路
后端思路:
登录失败有以下这几种情况:
-
验证码失效
-
验证码错误
-
用户密码输入错误
以上三种情况层层递进,第三种的话是属于spring security层面的认证。所以我们需要在第三种前去判断登录失败几次,如果超过5次就直接限制,无法进入第三种认证。
1.2 如何实现?
添加一张 "用户系统访问表" 。
该表记录用户账号、登录IP、登录地点、浏览器类型、访问时间、登录状态成功或者失败。
用户登录系统不管是失败还是成功都记录在这张表中。
当要进入第三种用户认证前,进行五次失败校验。
1.利用分页 用户名+失败状态倒序查询
2.当查询结果有5,这时候我们要判断是否在一天内输入失败五次。
long firstTime = loginList.get(4).getLoginTime().getTime();
long lastTime = loginList.get(0).getLoginTime().getTime();
long nowTime = new Date().getTime();
long limitTime = Integer.parseInt(policys[1]) * 60 * 60 * 1000;//限制一天
if((firstTime + limitTime > lastTime) && (lastTime + limitTime > nowTime)){"失败次数过多,已被限制登录"));
throw new CustomException("失败次数过多,已被限制登录");}
意思就是说 如果找出来 5条失败的登录记录,我们要判断是否是在一天内失败的次数。
那么最早那条记录+一天>最晚那条记录,最晚那条记录+一天>现在,这两个条件都成立就说明是一天失败的次数。