Sa-Token+redis实现账号封禁
准备工作: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实现账号封禁相关推荐
- python 实现账号封禁30分钟---(Redis,Mysql,文件)三种方法
下面写三种方法来实现,用户在规定时间内,输入次数上限,封禁账号的功能. 第一种:使用redis完成用户封禁状态 第二种:使用mysql 第三种:使用文件 1.封禁用户流程图 第一种方法: Redis ...
- 账号或密码多次输入错误,进行账号封禁
目录 账号封禁的规划 账号封禁的流程图编辑 实际场景中如何应用 使用mysql作为计数器 使用redis作为计数器 账号封禁的规划 账号封禁的流程图 实际场景中如何应用 使用mysql作为计数器 本 ...
- openresty开发系列38--通过Lua+Redis 实现动态封禁IP
openresty开发系列38--通过Lua+Redis 实现动态封禁IP 一)需求背景为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝 ...
- 事关ChatGPT账号封禁的强烈忠告
文 / 韩彬(微信公众号:量子论) 这两天有不少朋友加我微信(hanbin266),咨询ChatGPT账户被封了,怎么办? 我在<真实发生了,滥用这种场景,ChatGPT账号被封禁>一文已 ...
- Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP
前言:由于公司前几天短信接口被一直攻击,并且攻击者不停变换IP,导致阿里云短信平台上的短信被恶意刷取了几千条,然后在Nginx上对短信接口做了一些限制 临时解决方案: 1.查看Nginx日志发现被攻击 ...
- Nginx 通过 Lua + Redis 实现动态封禁 IP
背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面,配置 ...
- Openresty通过Lua+Redis 实现动态封禁IP
需求背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务.并且可以设置失效 环境准备 linux version:centos ...
- Nginx 通过 Lua + Redis 实现动态封禁 IP 1
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:segmentfault.com/a/1190000018267201 背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们 ...
- 针对近日ChatGPT账号大批量封禁的理性分析
文 / 高扬(微信公众号:量子论) 这两天不太平. 3月31号,不少技术圈的朋友和我闲聊说,ChatGPT账号不能注册了. 我不以为然,自己有一个号足够了,并不关注账号注册的事情. 后面又有不少朋友和 ...
最新文章
- 公司网络推广浅析网站想要“久居”首页的方法有哪些?
- linux下mysql中文乱码
- 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
- 如何通过Graph+AI的方法打造高精度风控模型
- jdbctemplate分页mysql_jdbcTemplate实现分页功能
- Java DOC 转换给 PDF 格式文档的代码
- python单词倒排_【原创】python倒排索引之查找包含某主题或单词的文件
- 从zabbix的数据库获取数据
- 三、Spring Cloud的配置 之 服务提供者 配置
- 构建最基础的Spring项目及所需要的jar包
- 程序员面试金典--变位词排序
- Cisco笔记1-访问CISCO 路由器的方法
- C# 调用dll文件
- PCB设计-Allegro软件入门系列第十四讲-设计参数配置(上)
- js练习:模拟京东快递单号查询
- 信息安全 SEED Lab2 Shellshock Attack
- android摇一摇功能实现
- 小猿圈python_小猿圈Python配置gRPC环境
- HTML CSS个人网页设计与实现——人物介绍丁真(学生个人网站作业设计)
- 抢跑抖音 中国短视频第一股海外市场将如何布局?