登录次数过多限制登录

登录次数过多限制登录demo

当用户密码输入次数过多时,限制用户的登录,一方面保护账号的安全,另一方面防止恶意登录.

下面提供两个版本,mysql与redis

mysql直接在表中增加字段flag,用户输入密码错误flag+1,判断这个数据如果大于5.就拦截请求,直接返回.

但是mysql在计算时间不如redis,会更繁琐一些.当然看业务需求,密码错误5次之后,必须更改密码,更改密码之后把flag字段清零.

或者用手机号登录,登录成功就把flag字段清零.

mysql:

# 登录接口
class Login(APIView):
    def get(self, request):
        # mysql
        # 接收参数
        username = request.GET.get('username')
        password = request.GET.get('password')

        # 查询数据
        user = User.objects.filter(username=username).first()
        if user and user.flag < 5 and user.password == make_password(password):
            return Response({
                'code': 200,
                'msg': '登录成功',
                'user': username,
                'uid': user.id
            })
        elif user and user.flag >= 5:
            return Response({
                'code': 400,
                'msg': '错误超过5次,请联系客服'
            })
        elif user and user.flag < 5 and user.password != make_password(password):
            user.flag += 1
            user.save()
            return Response({
                'code': 400,
                'msg': '用户名或密码错误'
            })
        else:
            return Response({
                'code': 400,
                'msg': '用户不存在'
            })

redis:

# redis
        # 接收参数
        username = request.GET.get('username')
        password = request.GET.get('password')
        #判断列表的长度
        code = r.llen(username)
        # 查询数据
        user = User.objects.filter(username=username).first()
        #如果这个用户名存在并且列表长度小于5
        if user and code < 5 and user.password == make_password(password):
            return Response({
                'code': 200,
                'msg': '登录成功',
                'user': username,
                'uid': user.id
            })
        elif user and code >= 5:
            # 如果倒计时为-1才重新计时
            if r.ttl(username) == -1:
                r.expire(username, 60 * 60 * 12)
            print(r.ttl(username))
            return Response({
                'code': 400,
                'msg': '错误超过5次,请24小时之后再尝试'
            })
        elif user and code < 5 and user.password != make_password(password):
            #当用户密码输入错误,列表存入一个元素
            r.lpush(username, 1)
            return Response({
                'code': 400,
                'msg': '用户名或密码错误'
            })
        else:
            return Response({
                'code': 400,
                'msg': '用户不存在'
            })
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值