0to1利用Redis实现“登录验证”次数限制

打印 上一主题 下一主题

主题 1811|帖子 1811|积分 5433

1 弁言

体系为了制止密码遭到暴力破解,通常情况下须要在登录时,限制用户验证账号密码的次数,当达到肯定的验证次数后,在一段时间内锁定该账号,不再验证。本章将用几行代码实现该功能,完备代码链接在文章最后。
2 原理介绍

可以看到在登录接口中,4行代码即可实现该功能,这里利用Redis可以很方便的记载“登录失败次数”,以及设置其失效时间(即锁定时间),主要步骤是:

  • 账号登录时,当前账号“登录失败次数”默认+1。
  • 设置“登录失败次数”失效的时间(即锁定时间)。
  • 当“登录失败次数”大于某个阈值时,就直接返回错误提示,不再走验证逻辑。
  • 账号登录乐成,清除“登录失败次数”,重新计数。
留意:第2步和第3步,可以互换序次。
第2步在前时,锁定中发起哀求会导致重新计时。
第3步在前时,锁定中发起哀求不会导致重新计时。

3 代码

isTrue是断言方法,不满意条件时,抛出非常,在全局非常处理中,同一返回错误提示。参见Spring全局非常处理HandlerExceptionResolver利用。
  1. package com.zeroone.service.sys;
  2. import com.zeroone.common.RedisKey;
  3. import com.zeroone.entity.sys.User;
  4. import com.zeroone.service.BaseService;
  5. import com.zeroone.utils.Param;
  6. import org.springframework.stereotype.Service;
  7. import java.util.concurrent.TimeUnit;
  8. @Service("UserService")
  9. public class LoginServiceImpl extends BaseService implements LoginService {
  10.     @Override
  11.     public Object webLogin(Param info) {
  12.         String account = info.getStringNotNull("account").trim();
  13.         String password = info.getStringNotNull("password").trim();
  14.         Long loginFailedCount = redisTemplate.opsForValue().increment(RedisKey.LOGIN_FAILED_COUNT + account, 1);//先将登录失败次数+1
  15.         redisTemplate.expire(RedisKey.LOGIN_FAILED_COUNT + account, 10, TimeUnit.SECONDS);// 指定登录失败次数失效时间
  16.         isTrue(loginFailedCount <= 5, "请10秒后重试!");//当登录失败次数大于阈值后,直接返回错误信息
  17.         //TODO 模拟验证密码
  18.         isTrue(password.equals("12345"), "账号或密码错误,还能重试" + (5 - loginFailedCount) + "次!");
  19.         redisTemplate.delete(RedisKey.LOGIN_FAILED_COUNT + account);// 验证通过后,清除登录失败次数
  20.         User user = new User();
  21.         user.setId(1L);
  22.         user.setName("张三");
  23.         user.setAccount("12345678901@qq.com");
  24.         user.setPhone("12345678901");
  25.         String token = tokenService.createToken(user);
  26.         return token;
  27.     }
  28.     @Override
  29.     public void logout() {
  30.         tokenService.deleteToken();
  31.     }
  32. }
复制代码
  1.     /**
  2.      * true断言
  3.      *
  4.      * @param expression 参数
  5.      * @param msg        描述
  6.      */
  7.     public void isTrue(boolean expression, String msg) {
  8.         if (!expression) {
  9.             throw new MyRuntimeException(HttpCode.BAD_REQUEST_CODE, msg);
  10.         }
  11.     }
复制代码
4 测试


  • 启动项目,哀求:http://localhost:8080/web/login,输入错误的密码,提示"账号或密码错误,还能重试X次!"。

2. 然后一连验证错误5次后,提示"请10秒后重试!",表示该账号被锁定,拒绝验证,且10秒内无法再次哀求验证。

5 完备代码

Gitee代码链接

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表