需要

实现登录限度

实现

后端老手,借助数据库实现了这么一个性能。具体实现思路如下:

1.思路

1.1 锁定账户

验证用户输错明码次数,记录谬误次数,当次数超过规定数字后,给该账户设置锁定状态,并设置锁定工夫(当天的24点)
这样当用户每次登陆的时候先验证下是否锁定,再解决其余业务

1.2 解锁账户

解锁的办法比较简单,当用户再次登录时,用以后工夫去和锁定状态下的锁定工夫进行比对,大于锁定工夫就进行解锁,并重置锁定工夫为null,锁定状态

2.革新表

在原有的user表新增字段

  • lock_status: 账户锁定状态 默认0未锁定 1已锁定
  • lock_time: 记录锁定截止工夫 默认null
  • error_num: 记录明码验证谬误次数 默认0
  • lock_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 &lt; 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>