如何利用Redis实现密码多次输入错误后对账号进行锁定

799 阅读2分钟

需求描述

我们在平时的工作中可能会遇到以下的业务需求:在用户登录账号时,用户密码多次输入错误后需要将用户的账号进行一个短时间的封禁。比如密码错误5次之后锁定该账号一个小时,一个小时之后方可再次尝试登录 。

思路分析

  1. 用户登录时首先验证登录账号是否存在,如果存在则继续下一步,不存在直接返回给前端;
  2. 判断redis中代表用户登录失败的key是否存在,如果存在,则代表这个用户不是第一次因密码错误登录失败了,所以直接判断次数是否大于五次,若大于则返回给前端;
  3. 之后利用定义好的key去获取value,value用字符串存储,转成数值类型加一,判断value是否大于上限,若大于则直接返回,若小于则加一后重新储存,同时重设过期时间;
  4. 如果key不存在,但是密码错误,则说明是第一次进来,需要根据用户的账号设置一个独属于该账号的key值,用定义好的key给到redis里面,value给成字符串1,同时设置过期时间;

代码实现

核心代码如下:

public String verifyUserPassword(User user) {

        //首先判断用户输入的账号是否存在,若不存在则直接返回给前端。
        if(null= userDaoImpl.queryUser(user)){
            return "该账号不存在";
        }
        
        //boos的值为redis中是否有该key存在
        Boolean boos = redisTemplate.hasKey(user.getUseraccount());

        //判断redis中key是否存在,如果存在判断错误次数是否大于等于5,如果大于等于,则直接返回
        if (boos) {
            //根据key获取错误次数
            if (Integer.parseInt(redisTemplate.opsForValue().get(user.getUseraccount())) >= 5) {
                return "该账号已被锁定";
            }
        }
        //2.根据账号获取密码
        String password = userDaoImpl.queryUserPassword(user);
        //用输入密码与数据库密码比对
        Boolean boo = password.equals(user.getPassword());

        if (boo) {
            //如果密码相同,则看redis中是否有错误次数,如果有则删除
            if (boos) {
                redisTemplate.delete(user.getUseraccount());
            }
            return "登录成功";
        }

        //密码错误进行redis操作
        if (!boo) {
            //3.证明密码错误
            if (boos) {
                //redis中有此key,获取key的数值并加1
                Integer inte = Integer.parseInt(redisTemplate.opsForValue().get(user.getUseraccount()));
                inte++;
                redisTemplate.opsForValue().set(user.getUseraccount(), inte + "");
            } else {
                //redis中没有此key,密码是第一次错误,根据用户的账号设置一个独属于该账号的key值
                redisTemplate.opsForValue().set(user.getUseraccount(), 1 + "");
                //redis中设置key的过期时间
                redisTemplate.expire(user.getUseraccount(), 3600, TimeUnit.SECONDS);
            }
            //判断错误次数,大于等于5次锁定
            if (Integer.parseInt(redisTemplate.opsForValue().get(user.getUseraccount())) >= 5) {
                //redis中设置key的过期时间
                redisTemplate.expire(user.getUseraccount(), 3600, TimeUnit.SECONDS);
               return "密码错误5次,账号已被锁定一小时";
            }
        }
        return "登录失败,请检查你的账号密码是否正确";
    }