09.密码错误次数达到限制锁定帐户(Spring、SpringMvc、Jpa、Shiro)

需求:当用户输入密码错误次数达到3次的时候,锁定帐户sql

1.思路分析:

1.1.咱们在什么时候能够得知用户输入密码错误?
1.2.若是记录用户密码错误次数?
1.3.如何实现帐户锁定功能?
首先,咱们获取用户密码错误,能够在登陆的时候能够进行密码断定,便可得知密码错误与否;其次,关于记录密码错误次数,我先想到的,是直接加一个计数器在登陆的Controller里面,可是很容易反应过来,就是当用户再次登陆的时候,不可获取当前登陆用户是否为上次登陆密码错误的用户,因而我想到了在数据库中加一个字段来记录密码错误次数;最后,实现帐户锁定,这个就很简单了,直接在登陆的时候,根据用户名查询当前用户的错误次数,若是大于2次,就直接拒绝登陆,并给到用户提示。数据库

2.代码实现:

2.1.数据库操做和domain

在数据库中加入记录错误次数的字段
image.png
关于字段值的类型,均可以自定义,建议不用高精度(不必,用不着,也很差判断),而后在对应的domain中加入字段,可自定义dom

//记录错误次数的字段  
private Integer errornum;
2.2.Controller层

对用户密码错误次数进行判断处理,若是达到了3次,就拒绝登陆ide

//若是当前用户不为空而且若是它的密码错误次数大于2
        if (employee != null && employee.getErrornum()>2) {
            //给前台返回登陆结果为false并给出提示
            return new AjaxResult(false,"您的帐户已经被锁定,请殴打程序猿解锁密码");
        }

而若是没有达到3次,就在密码错误的异常里面根据用户id进行修改密码错误次数的操做,以达到计数的功能spa

//密码每错误异常,那么错误就加一次,根据id来修改用户的密码错误次数

employeeService.changeErrorTimes(employee.getId());

2.3.Service层

servicecode

void changeErrorTimes(Long id);

serviceimplblog

@Override
    public void changeErrorTimes(Long id) {
        employeeRepsitory.changeErrorTimes(id);
    }

这里都是直接调方法就行事务

2.4.Repository层

/**
     *  若是输错密码,就直接将数据库中的错误次数+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

3.结语

到这里,咱们的密码错误次数功能就完成了,不须要额外的jar包,只是简单的操做数据库和一些判断,主要在于思路,但愿个人分享可以帮到你。it

相关文章
相关标签/搜索