需要
实现登录限度
实现
后端老手,借助数据库实现了这么一个性能。具体实现思路如下:
1.思路
1.1 锁定账户
验证用户输错明码次数,记录谬误次数
,当次数超过规定数字后,给该账户设置锁定状态
,并设置锁定工夫
(当天的24点)
这样当用户每次登陆的时候先验证下是否锁定,再解决其余业务
1.2 解锁账户
解锁的办法比较简单,当用户再次登录时,用以后工夫
去和锁定
状态下的锁定工夫
进行比对,大于锁定工夫
就进行解锁,并重置锁定工夫为null
,锁定状态
2.革新表
在原有的user
表新增字段
lock_status
: 账户锁定状态 默认0未锁定 1已锁定lock_time
: 记录锁定截止工夫 默认nullerror_num
: 记录明码验证谬误次数 默认0lock_num
: 容许的谬误次数(默认5),这里写在数据库里是为了前期不便批改,而没有写在代码里
3. UserDO
@Datapublic class UserDO { private int id; private String username; @JSONField(serialize = false) private String password; private int lock_status; private Timestamp lock_time;}
4.LoginMapper
@Mapperpublic interface LoginMapper { UserDO login(Map params); void setLockNum(Map params); void setLockTime(Map params); UserDO getLockStatus(Map params); void resetLockStatus(Map params);}
5.LoginService
public interface LoginService { Result login(Map params);}
6.LoginServiceImpl
public class LoginServiceImpl implements LoginService { @Autowired LoginMapper loginMapper; @Override public Result login(Map params) { UserDO res = loginMapper.login(params); UserDO lockStatus = loginMapper.getLockStatus(params); if(lockStatus!=null && lockStatus.getLock_status()==1){ Date date = new Date(); if(lockStatus.getLock_time() == null){ System.out.println("--------⏰⏰⏰⏰⏰----------"); System.out.println("锁定工夫为空,设置锁定工夫"); System.out.println("--------⏰⏰⏰⏰⏰----------"); loginMapper.setLockTime(params); }else{ if(date.getTime() > lockStatus.getLock_time().getTime()){ System.out.println("------------------"); System.out.println("锁定工夫生效,清空锁定状态"); System.out.println("------------------"); loginMapper.resetLockStatus(params); UserDO freshmen = loginMapper.login(params); return allResult(params, freshmen); } else { System.out.println("------------------"); System.out.println("锁定状态中"); System.out.println("------------------"); } } String time = UtilFun.formatTime("yyyy年MM月dd日").format(date); return new Result(false, 40001, "失败", "该账户验证次数已达下限,临时解冻至" + time + "24点,解冻期完结明码将被重置为初始密码,请分割管理员进行批改"); }else return allResult(params, res); } private Result allResult(Map params, UserDO res) { if(res == null){ System.out.println("--------❌❌❌❌----------"); System.out.println("用户名或明码谬误"); System.out.println("--------❌❌❌❌----------"); loginMapper.setLockNum(params); return new Result(false, 40001, "失败", "账号或明码谬误,请从新输出,超过5次将会被长期解冻"); }else{ System.out.println("-------✅✅✅✅✅-----------"); System.out.println("用户名或明码"); System.out.println("-------✅✅✅✅✅-----------"); return new Result(true, 20000, "胜利", res); } }}
7.sql
<select id="login" resultType="com.zdxf.domain.UserDO"> select * from fenghuang_cmda.sys_user <where> username = #{username} and password = #{password} and lock_status = 0 </where> </select> <select id="getLockStatus" resultType="com.zdxf.domain.UserDO"> select * from fenghuang_cmda.sys_user <where> username = #{username} </where> </select> <update id="setLockNum"> update fenghuang_cmda.sys_user set lock_status = (case when error_num = lock_num + 1 then 1 else 0 end), error_num =(case when error_num < lock_num then error_num + 1 else 5 end) <where> username = #{username} </where> </update> <update id="setLockTime"> update fenghuang_cmda.sys_user set lock_time = DATE_FORMAT(now(),'%Y-%m-%d 23:59:59')/*date_add(now(), interval + 5 minute)*/ <where> username = #{username} </where> </update> <update id="resetLockStatus"> update fenghuang_cmda.sys_user set lock_time = null,error_num=0,lock_status=0,password = 'af14a24b93d61df48ee08514cf92c4c5' <where> username = #{username} </where> </update>