当前位置: 首页 > news >正文

怎么做军事小视频网站品牌推广图片

怎么做军事小视频网站,品牌推广图片,高负载php网站开发,成都网页设计价格Redislua脚本限制ip多次输入错误密码 不能锁username,因为如果有人恶意保留破解密码的话。会导致用户本人无法登录。 这里我采用 以ip的方式进行锁定。利用redis 设置key:ip。value:当前ip尝试登录的次数 实现逻辑 逻辑简单,假设…

Redis+lua脚本限制ip多次输入错误密码

不能锁username,因为如果有人恶意保留破解密码的话。会导致用户本人无法登录。
这里我采用 以ip的方式进行锁定。利用redis
设置key:ip。value:当前ip尝试登录的次数

实现逻辑

逻辑简单,假设限制错误次数为5

  1. 用户登录时。判断key是否存在。
  2. 如果key不存在,说明第一次登录。判断密码是否正确,如果正确什么都不干直接返回。如果不正确,设置key为ip,value为1,并设置过期时间,返回错误信息。
  3. 如果存在key,说明之前尝试登录过。判断value是否大于阈值,如果大于阈值刷新过期 并返回错误。如果小于阈值,还要判断密码是否正确如果密码正确,删除key并返回正确信息。如果密码不正确,将key的value值+1并重置过期时间,返回密码错误的信息。

以上主要注意两点
一点是有key的情况下密码正确需要删除key
二是有key的情况下,密码错误或者尝试次数大于阈值再次尝试登录,需要刷新过期时间

使用lua脚本主要保证了对上述逻辑的原子性,因为涉及获取key的值并判断,然后将key的值+1 或 删除key。

实现代码

Service类加载时,加载lua脚本

    private static final DefaultRedisScript<Long> CHECK_LOGIN_SCRIPT;// 类加载时 加载lua脚本static {CHECK_LOGIN_SCRIPT = new DefaultRedisScript<>();CHECK_LOGIN_SCRIPT.setLocation(new ClassPathResource("checkLogin.lua"));CHECK_LOGIN_SCRIPT.setResultType(Long.class);}

具体校验方法,主要逻辑调用了lua脚本

    private void checkLoginInfo(UserLoginContext userLoginContext) {String username = userLoginContext.getUsername();String password = userLoginContext.getPassword();//根据用户名查实体 从数据库RPanUser entity = getRPanUserByUsername(username);if (Objects.isNull(entity)){throw new RPanBusinessException("用户名不存在");}String salt = entity.getSalt();             //获取盐值String encPassword = PasswordUtil.encryptPassword(salt, password) ;  //将前端传 的密码加密String dbPassword = entity.getPassword();   //获取数据库的密码// encPassword 表示前端传过来的 加密后的密码// dbPassword  表示数据库中的   加密后的密码// TODO 调用lua脚本判断 登录失败 登录成功 及锁定ipList<String> keys = new ArrayList<>();String ipAddress = HttpLogEntityBuilder.getIpAddress(userLoginContext.getRequest());    //获取请求ip// key设置为 ip+username,进行锁定keys.add(UserConstants.CHECK_LOGIN_PREFIX + ipAddress + "_" + username);// 执行lua脚本Long result = (Long)redisTemplate.execute(CHECK_LOGIN_SCRIPT, keys, encPassword, dbPassword, UserConstants.CHECK_LOGIN_THRESHOLD, UserConstants.CHECK_LOGIN_EXPIRE);if (result == 0){throw new RPanBusinessException("用户名或密码不正确");}if (result == -1){throw new RPanBusinessException("输入密码错误达到"+UserConstants.CHECK_LOGIN_THRESHOLD+"次,请1分钟后尝试");}
//        if (!Objects.equals(encPassword, dbPassword)) {
//            throw new RPanBusinessException("密码信息不正确");
//        }//填入实体信息userLoginContext.setEntity(entity);}

lua脚本,放在resources目录下

-- 判断用户登录的lua脚本local key1 = KEYS[1]
local password1 = ARGV[1]
local password2 = ARGV[2]
-- 阈值
local threshold = ARGV[3]
-- 过期时间
local expiretime = ARGV[4]-- 判断key是否存在
local value = redis.call('get', key1)-- 有key
if value thenif(value >= threshold) thenredis.call('expire', key1, expiretime)  -- 刷新过期时间return -1                               -- 输入密码错误达到threshold次,请1分钟后尝试endif(password1 == password2) then -- 校验正确,删除key并返回1表示通过redis.call('del', key1)return 1elseredis.call('INCR', key1)               -- key的值+1redis.call('expire', key1, expiretime) -- 刷新过期时间return 0                                -- 用户名或密码不正确end
end-- 没有key
if(password1 == password2) thenreturn 1
elseredis.call('setex', key1, expiretime, 1) -- setex key [过期时间] 1return 0   -- 用户名或密码不正确
end
http://www.yayakq.cn/news/54959/

相关文章:

  • 江西省水利水电建设集团招标网站买男装最好的购物网站
  • 自做建材配送网站网站首页404
  • 网站建设siteserverasp.net 网站管理工具
  • 商城开发网站建设管理网站建设哪里好
  • 多肉建设网站前的市场分析wordpress设置导航菜单
  • 微信网站开发制作平台网站页脚的制作
  • 外贸专用网站鞋 东莞网站建设 技术支持
  • c网站开发案例详解代码宁夏建设职业技术学院成绩查询网站
  • 做网站go和php用哪个好百度推广获客方法
  • 成都红酒网站建设信阳市住房和城乡建设局网站
  • 兰州网站建设人才招聘网站开发工资济南
  • 怎样进网站空间高端网站建设的公司哪家好
  • 功能网站开发极简网站设计
  • 网站 文件验证怎么制作网站小游戏
  • 群辉怎么做视频网站wordpress 标签 边栏
  • 做的网站客户拿去维违法工程公司名字大全大气好听
  • 网站托管服务win7上怎样卸载wordpress
  • 英雄联盟网站源码2017网站开发兼职
  • 前端代码 分享网站网页制作过程及步骤
  • 开发区网站建设公司超链接 网站
  • 万全孔家庄做网站二级网站如何一级域名
  • 牟长青 做网站推广的四个基本要点微商货源网
  • ps里面怎么做网站对联广告wordpress 评论顺序
  • 淮南建设局网站备案阜宁专业做网站
  • 建一个网站大约多少钱有什么平台做网站比较好
  • 个人网站主页汕头百度seo在哪里
  • 家乡网站建设策划案做网站用什么电脑
  • 上海做网站技术凯里市住房和城乡建设局网站
  • 怎么建设自己淘宝网站溧阳建设局网站
  • 息壤服务器网站打不开家具营销策划方案