利用redis数据库实现账户锁定

需求 –> 用户输入密码错误,连续错误三次以上,封锁账号在设定时间内不能再登录,直至封锁时间结束后用户才能再登录。
首先我们用到redis中的 lpush – expire – ttl – llen 其方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
COPY

# 建立连接连接
host = "localhost"
port = 6379
r = redis.Redis(host=host,port=port)
#用户名
username = '123'


#账号密码输入错误5次后锁住账号逻辑
#列表操作
r.lpush(username,1)

#设置过期时间,单位是秒
r.expire(username,30)
#打印过期时间
print(r.ttl(username))
#打印列表长度
print(r.llen(username))
if r.llen(username) > 3:
    print('你的账号被锁定')

View Code

以下是在项目中实现锁定功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
COPY
#登录接口
class Login(APIView):
    def get(self,request):
        #接收参数
        username = request.GET.get('username',None)
        password = request.GET.get('password',None)
        #验证验证码
        if code != redis_code:
            return Response({'code':403,'message':'验证码错误'})
        #如果用户的列表长度大于等于3
        if r.llen(username) >= 3:
            return Response({'code':403,'message':'你的账号已被锁定'})
        #查询用户数据
        user = User.objects.filter(username=username).first()
        if user:
            #比较密码是否一致,如果一致则登录成功
            if user.password == make_password(password):
                return Response({'code':200,'message':'登陆成功','uid':user.id,'username':user.username})
            #不一致则计数加1,返回密码错误
            else:
                r.lpush(username,1)
                r.expire(username,30)
                return Response({'code':403,'message':'用户名或密码错误'})
        else:
            return Response({'code':403,'message':'用户名或密码错误'})

View Code