需求:当用户输入密码错误次数达到3次的时候,锁定帐户sql
1.1.咱们在什么时候能够得知用户输入密码错误?
1.2.若是记录用户密码错误次数?
1.3.如何实现帐户锁定功能?
首先,咱们获取用户密码错误,能够在登陆的时候能够进行密码断定,便可得知密码错误与否;其次,关于记录密码错误次数,我先想到的,是直接加一个计数器在登陆的Controller里面,可是很容易反应过来,就是当用户再次登陆的时候,不可获取当前登陆用户是否为上次登陆密码错误的用户,因而我想到了在数据库中加一个字段来记录密码错误次数;最后,实现帐户锁定,这个就很简单了,直接在登陆的时候,根据用户名查询当前用户的错误次数,若是大于2次,就直接拒绝登陆,并给到用户提示。数据库
在数据库中加入记录错误次数的字段
关于字段值的类型,均可以自定义,建议不用高精度(不必,用不着,也很差判断),而后在对应的domain中加入字段,可自定义dom
//记录错误次数的字段 private Integer errornum;
对用户密码错误次数进行判断处理,若是达到了3次,就拒绝登陆ide
//若是当前用户不为空而且若是它的密码错误次数大于2 if (employee != null && employee.getErrornum()>2) { //给前台返回登陆结果为false并给出提示 return new AjaxResult(false,"您的帐户已经被锁定,请殴打程序猿解锁密码"); }
而若是没有达到3次,就在密码错误的异常里面根据用户id进行修改密码错误次数的操做,以达到计数的功能spa
//密码每错误异常,那么错误就加一次,根据id来修改用户的密码错误次数 employeeService.changeErrorTimes(employee.getId());
servicecode
void changeErrorTimes(Long id);
serviceimplblog
@Override public void changeErrorTimes(Long id) { employeeRepsitory.changeErrorTimes(id); }
这里都是直接调方法就行事务
/** * 若是输错密码,就直接将数据库中的错误次数+1 * @param id */ @Transactional @Modifying @Query(nativeQuery = true,value = "update employee e set e.errornum = e.errornum + 1 where id = ?") void changeErrorTimes(Long id);
须要注意的是,这里咱们必须加事务,不然修改操做不会成功,我我的习惯写原生sql语句,由于Jpql要转换一遍,以为效率比较低,我的习惯。get
到这里,咱们的密码错误次数功能就完成了,不须要额外的jar包,只是简单的操做数据库和一些判断,主要在于思路,但愿个人分享可以帮到你。it