共计 3216 个字符,预计需要花费 9 分钟才能阅读完成。
需要
实现登录限度
实现
后端老手,借助数据库实现了这么一个性能。具体实现思路如下:
1. 思路
1.1 锁定账户
验证用户输错明码次数,记录谬误次数
,当次数超过规定数字后,给该账户设置 锁定状态
,并设置 锁定工夫
(当天的 24 点)
这样当用户每次登陆的时候先验证下是否锁定,再解决其余业务
1.2 解锁账户
解锁的办法比较简单,当用户再次登录时,用 以后工夫
去和 锁定
状态下的 锁定工夫
进行比对,大于锁定工夫
就进行解锁, 并重置锁定工夫为null
, 锁定状态
2. 革新表
在原有的 user
表新增字段
lock_status
: 账户锁定状态 默认 0 未锁定 1 已锁定lock_time
: 记录锁定截止工夫 默认 nullerror_num
: 记录明码验证谬误次数 默认 0lock_num
: 容许的谬误次数(默认 5),这里写在数据库里是为了前期不便批改,而没有写在代码里
3. UserDO
@Data
public class UserDO {
private int id;
private String username;
@JSONField(serialize = false)
private String password;
private int lock_status;
private Timestamp lock_time;
}
4.LoginMapper
@Mapper
public 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>
正文完
发表至: springboot
2021-05-21