准备工作:SpringBoot项目中引入Redis

  • 添加依赖

  • 添加连接配置

解决办法:

  • 根据用户的账号作为Key,(加一个前缀)查看是否被锁

  • 1、账号未被封禁:

    • 利用Satoken方法,获取封禁的剩余时间,最开始的时候账号肯定是未被封禁的,返回-2,未被封禁,不走封禁的逻辑,

      // 获取指定账号剩余封禁时间,单位:秒,如果该账号未被封禁,则返回-2  StpUtil.getDisableTime(10001); 
    • 我们执行判断,判断是否登录失败(账号密码不对),redis做一个缓存,<key,value>,value记录登录错误的次数。设置key的过期时间,

      • 登录次数判断

        • 次数小于5,number计数加1,超过key的过期时间,删除缓存中的key,number也清空。

        • 次数大于等于5,封禁,StpUtil.disable(userAccount, 60 * 5);,锁五分钟后自动解禁,删除缓存中的key

  • 2、账号被封禁:

    • 如果账号是已经被封禁了,我们需要根据封禁的剩余时间,返回给前端,用户还需等待多长时间,做了一个判断,大于一分钟,返回分钟,小于一分钟,返回秒

springboot引入redis的使用

 写入缓存ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();operations.set(key, value);设置失效时间:         redisTemplate.expire(key, expireTime, timeUnit);删除key对应的value            redisTemplate.delete(key);读取缓存 ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();result = operations.get(key);

解决办法

  • 1、前端传参------用户的账号,密码

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "UserLoginVO对象", description = "用户表UserLoginVO")
public class UserLoginVO implements Serializable {
​private static final long serialVersionUID = 1L;
​@ApiModelProperty(value = "用户账号",required = true)@NotBlank(message = "用户账号不能为空")@Size(max = 50,message = "用户账号应在1~50个字符之间")private String userAccount;
​@ApiModelProperty(value = "用户密码",required = true)@NotBlank(message = "用户密码不能为空")private String userPassport;
​
}

2、Controller登陆方法中:不做其他逻辑设计,仅封禁功能

首先判断是否被封禁

// 判断是否被封禁
isDisableTime(vo);

利用SaToken的自动封禁

Sa-Token

// 封禁指定账号
StpUtil.disable(10001, 86400);
​
// 获取指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
StpUtil.isDisable(10001);
​
// 校验指定账号是否已被封禁,如果被封禁则抛出异常 `DisableServiceException`
StpUtil.checkDisable(10001);
​
// 获取指定账号剩余封禁时间,单位:秒,如果该账号未被封禁,则返回-2
StpUtil.getDisableTime(10001);
​
// 解除封禁
StpUtil.untieDisable(10001); 
/*** 是否封禁状态* 如果被封禁了,执行以下逻辑,返回前端还需等待的时间* @param vo 登录vo*/
private void isDisableTime(UserLoginVO vo) {// disableTime = -2表示未被封禁long disableTime = StpUtil.getDisableTime(vo.getUserAccount());if (disableTime > 0) {if (disableTime > 60) {throw new BizException(CommonErrorCode.USER_LOGIN_LOCK.getResultCode(),String.format(CommonErrorCode.USER_LOGIN_LOCK.getResultMsg(), disableTime / 60 + "分钟"));}throw new BizException(CommonErrorCode.USER_LOGIN_LOCK.getResultCode(),String.format(CommonErrorCode.USER_LOGIN_LOCK.getResultMsg(), disableTime + "秒"));}
}

3、因为账号未被封禁,我们需要统计失败登录的次数,执行方法,记录登录错误的次数和设置key的过期的时间

4、统计登录失败的次数和过期时间

根据用户账号,生成一个变量Key,(一般加前缀)

第一次登录失败,number=null

第二次登录失败,number=2(赋值为2)

第三次登录失败,number=3(执行number++)

第四次登录失败,number=4(执行number++)

第五次登录失败,number=5(执行number++,账号被封禁,超过封禁的时间自动解除封禁。删除key)

第六次登录,因为账号已经被封禁,返回前端还需等待的时间

redis用法:
我能感受到困意
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
​
根据key定义变量number 获取登录错误的次数:
Integer number = (Integer) valueOperations.get(loginErrorKey);

设置key的过期时间为5分钟:

valueOperations.set(loginErrorKey, number,5,TimeUnit.MINUTES);
/*** redis中保存登录错误次数** @param userAccount 账号*/private void saveLoginTimes(String userAccount) {String loginErrorKey = LOGIN_ERROR_TIMES_KEY_PREFIX + userAccount;
​ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();Integer number = (Integer) valueOperations.get(loginErrorKey);
​if (number == null) {// 如果redis中没有保存,代表失败第一次number = 2;valueOperations.set(loginErrorKey, number,5,TimeUnit.MINUTES);return;}
​if (number < 5) {number++;valueOperations.set(loginErrorKey, number,5,TimeUnit.MINUTES);return;}
​// 第五次封禁账号,第六次进入isDisableTime方法,返回用户还需等待时间StpUtil.disable(userAccount, 60 * 5);
​// 删除redis 中的keyclearLoginErrorTimes(userAccount);}

5、登录成功,删除key,清空登录次数

 /*** 登录成功、清空登录次数* @param userAccount 账号*/private void clearLoginErrorTimes(String userAccount) {String loginErrorKey = LOGIN_ERROR_TIMES_KEY_PREFIX + userAccount;// 删除redis 中的keyredisTemplate.delete(loginErrorKey);}

Sa-Token+redis实现账号封禁相关推荐

  1. python 实现账号封禁30分钟---(Redis,Mysql,文件)三种方法

    下面写三种方法来实现,用户在规定时间内,输入次数上限,封禁账号的功能. 第一种:使用redis完成用户封禁状态 第二种:使用mysql 第三种:使用文件 1.封禁用户流程图  第一种方法: Redis ...

  2. 账号或密码多次输入错误,进行账号封禁

    目录 账号封禁的规划 账号封禁的流程图​编辑 实际场景中如何应用 使用mysql作为计数器 使用redis作为计数器 账号封禁的规划 账号封禁的流程图 实际场景中如何应用 使用mysql作为计数器 本 ...

  3. openresty开发系列38--通过Lua+Redis 实现动态封禁IP

    openresty开发系列38--通过Lua+Redis 实现动态封禁IP 一)需求背景为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝 ...

  4. 事关ChatGPT账号封禁的强烈忠告

    文 / 韩彬(微信公众号:量子论) 这两天有不少朋友加我微信(hanbin266),咨询ChatGPT账户被封了,怎么办? 我在<真实发生了,滥用这种场景,ChatGPT账号被封禁>一文已 ...

  5. Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

    前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制 临时解决方案: 1.查看Nginx日志发现被攻击 ...

  6. Nginx 通过 Lua + Redis 实现动态封禁 IP

    背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面,配置 ...

  7. Openresty通过Lua+Redis 实现动态封禁IP

    需求背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务.并且可以设置失效 环境准备 linux version:centos ...

  8. Nginx 通过 Lua + Redis 实现动态封禁 IP 1

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:segmentfault.com/a/1190000018267201 背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们 ...

  9. 针对近日ChatGPT账号大批量封禁的理性分析

    文 / 高扬(微信公众号:量子论) 这两天不太平. 3月31号,不少技术圈的朋友和我闲聊说,ChatGPT账号不能注册了. 我不以为然,自己有一个号足够了,并不关注账号注册的事情. 后面又有不少朋友和 ...

最新文章

  1. 公司网络推广浅析网站想要“久居”首页的方法有哪些?
  2. linux下mysql中文乱码
  3. 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
  4. 如何通过Graph+AI的方法打造高精度风控模型
  5. jdbctemplate分页mysql_jdbcTemplate实现分页功能
  6. Java DOC 转换给 PDF 格式文档的代码
  7. python单词倒排_【原创】python倒排索引之查找包含某主题或单词的文件
  8. 从zabbix的数据库获取数据
  9. 三、Spring Cloud的配置 之 服务提供者 配置
  10. 构建最基础的Spring项目及所需要的jar包
  11. 程序员面试金典--变位词排序
  12. Cisco笔记1-访问CISCO 路由器的方法
  13. C# 调用dll文件
  14. PCB设计-Allegro软件入门系列第十四讲-设计参数配置(上)
  15. js练习:模拟京东快递单号查询
  16. 信息安全 SEED Lab2 Shellshock Attack
  17. android摇一摇功能实现
  18. 小猿圈python_小猿圈Python配置gRPC环境
  19. HTML CSS个人网页设计与实现——人物介绍丁真(学生个人网站作业设计)
  20. 抢跑抖音 中国短视频第一股海外市场将如何布局?

热门文章

  1. [小程序技能树]reLaunch
  2. NIDays宣布LabVIEW双平台更新战略,NXG 2.0将于2018年初发布
  3. Fingerprintjs2:一款开源设备指纹采集器
  4. 多图介绍iMazing苹果手机管理软件的使用体验
  5. 股票交易数据接口获取股票基础信息数据的过程
  6. 机房维护怎么办?看看这五点内容吧
  7. R语言绘制带误差线的条形图
  8. paypal国际支付的对接,使用tp5开发paypal
  9. 华为上机【洞穴逃生】
  10. 抓住一切机遇,成功才有可能