登录次数过多限制登录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': '用户不存在'
})