为了账号安全,请及时绑定邮箱和手机立即绑定

java基于redis做登录错误锁定用户

2019.09.20 18:14 122浏览

大家好,一个人见人爱,花见花开的小白来跟大家分享来了,敲黑板,现在大多数应用以及网页登录都有登录失败锁定用户一段时间不让登录这一说,那么究竟是怎么实现呢,一起来看一下吧
首先说以下主题逻辑,然后贴代码

  1. 首先验证登录账号的有效性,是否存在,如果存在继续下一步,不存在直接丢给前端不存在
  2. 判断redis中代表用户登录失败的key(在下面代码里面,key用的是两个用户账号拼接成的字符串)是否存在
  3. 如果存在,则代表这个用户不是第一次因密码错误登录失败了,之后利用定义好的key去获取value,value用字符串存储,转成数值类型加一。
  4. 如果不存在,但是密码错误,则用定义好的key 给到redis里面,value给成字符串1。
  5. 下次登录时,便首先判断key是否存在,如存在判断错误次数,超过上限直接返回
    以上就是主要逻辑了,结合代码看更容易理解
    代码
 @Autowired
  private UserDao userDaoImpl;
  //注入RedisTemplate
  @Autowired
  private RedisTemplate<String,String> redisTemplate;
  //验证用户登录方法
  public String verifyUserPassword(User user) {
    //获取redis中对String字符串操作的对象
    ValueOperations<String, String> valueOperations= redisTemplate.opsForValue();
    //boos为判断redis中是否有此key存在
    Boolean boos;
    //失败或成功提示语
    String str = "";
    //1.首先验证账号的有效性,懒得验证了,大家结合自己的验证以下就好
    
    //验证此key是否存在,如果存在判断错误次数是否大于等于5,如果大于等于,则直接返回,不进行下面逻辑,否则继续进行
    boos = redisTemplate.hasKey(user.getUseraccount()+user.getUseraccount());
    if(boos){
	//根据key获取错误次数
      if(Integer.parseInt(valueOperations.get(user.getUseraccount()+user.getUseraccount()))>=5){
        return "用户已被锁定";
      }      
    }
    //2.根据账号获取密码
    String password = userDaoImpl.queryUserPassword(user);    
    //用输入密码与数据库密码比对
    Boolean boo = password.equals(user.getPassword());   
    
    if(boo){
         str ="密码正确";
    }
    //密码错误进行redis操作
    if(!boo){
      str ="密码错误";
      //3.证明密码错误   
       if(boos){
         //如果boos为true,则证明redis中有此key,获取key的数值并加1
         Integer inte = Integer.parseInt(valueOperations.get(user.getUseraccount()+user.getUseraccount()));
         inte++;
         valueOperations.set(user.getUseraccount()+user.getUseraccount(), inte+"");
       }else{
         //boos为flase,则证明redis中没有此key,密码是第一次错误,故走以下逻辑
         valueOperations.set(user.getUseraccount()+user.getUseraccount(), 1+"");
         //redis中设置key的过期时间
         redisTemplate.expire(user.getUseraccount()+user.getUseraccount(), 300, TimeUnit.SECONDS);
       }
       //判断错误次数,大于等于5次锁定
       if(Integer.parseInt(valueOperations.get(user.getUseraccount()+user.getUseraccount()))>=5){
         //redis中设置key的过期时间
         redisTemplate.expire(user.getUseraccount()+user.getUseraccount(), 300, TimeUnit.SECONDS);
         str ="密码错误5次,账号被锁定五分钟";
       }    
    }
    //如果密码相同,则看redis中是否有错误次数,如果有则删除
    boos = redisTemplate.hasKey(user.getUseraccount()+user.getUseraccount());
    if(boo){
      redisTemplate.delete(user.getUseraccount()+user.getUseraccount());
    }
    return str; 
  }

以上就是主要代码了,有更好方法的评论在下方哦!

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 邀请有奖 帮助中心 APP下载
官方微信

举报

0/150
提交
取消