首页 > 代码库 > 定义有参装饰器为被装饰函数添加认证功能,定义有参装饰器为被装饰函数添加认证功能,三次验证失败锁定用户

定义有参装饰器为被装饰函数添加认证功能,定义有参装饰器为被装饰函数添加认证功能,三次验证失败锁定用户

#需求:定义有参装饰器为被装饰函数添加认证功能,用户信息的来源可以是文件也可以是ldap         
# 三次验证失败锁定用户
技术分享
 1 def menu():
 2     #用户交互界面
 3     user_name = input("请输入在用户名:")
 4     password = input("请输入密码:")
 5     return user_name,password    #以元组形式返回值
 6 ‘‘‘
 7     alex1  1111
 8     alex2  2222
 9     egon3  3333
10 ‘‘‘
11 def write():
12     #将用户名、密码和登录次数在文件中写成字典的格式
13     user_name_password= {}#设置一个空字典装用户名、密码和登录次数
14     with open("test", encoding="utf8") as date, open("test2", encoding="utf8", mode="w") as revise:
15         for line in date:
16             line1 = line.strip().split()  #以空格分隔后是列表形式
17             user_name_password.setdefault(line1[0],[line1[1],0])#key值为用户名,value值为[密码,登录次数]
18         user_name_password = str(user_name_password)    #将字典转换成字符串
19         revise.write(user_name_password)   #将字典转换成的字符串写入文件test2
20 
21 def main():
22     write() #将用户信息、密码还有登录次数按字典格式写入另一个文件
23     while True:
24         res = menu()#用户名和密码输入,返回值为元组形式(用户名,密码)
25         with open("test2",encoding="utf8") as date:
26             user_name_password = {}  #创建一个空字典,接收用户、密码和登录次数的的数据
27             for line in date:
28                 user_name_password = eval(line) #将用户、密码和登录次数数据转化为字典
29                 if res[0] in user_name_password and user_name_password[res[0]][1] == 3:
30                     #文件中登录名已记录三次,禁止登录
31                     print("登录次数过多锁定")
32                     exit()
33                 if res[0] in user_name_password and res[1] in user_name_password[res[0]][0] and user_name_password[res[0]][1] < 3:
34                     #用户、密码匹配成功和登录次数小于三次,登录成功
35                     print("successful")
36                     current_login["name"] = res[0]
37                     current_login["login"] = True
38                     exit()
39                 if res[0] in user_name_password and res[1] not in user_name_password[res[0]][0]:
40                     #用户匹配,密码不匹配,拉入黑名单,登录次数+1
41                     user_name_password[res[0]][1]=user_name_password[res[0]][1]+1    #登录次数+1
42                     user_name_password.setdefault(res[0],user_name_password[res[0]][1])  #将字典中登录次数的信息进行修改
43                     user_name_password = str(user_name_password)   #将字典转换成字符串
44                     with open("test3", encoding="utf8", mode="w") as revise:
45                         revise.write(user_name_password)  #匹配不成功,将信息写入文件
46                     date.close()   #改文件名需关闭文件
47                     revise.close() #关闭文件需关闭文件
48                     import os
49                     os.rename("test2", "test_bak")
50                     os.rename("test3", "test2")
51                     os.remove("test_bak")  #删除废文件
52                     print("用户名或者密码错误,请重新输入")
53                 else:
54                     print("用户名或者密码错误,请重新输入")
55                     
56 current_login={"name":None,"login":False}  #定义一个字典装已经登录用户的信息
57 def auth2(auth_type):
58     def auth(func):
59         def wrapper(*args,**kwargs):
60             if current_login["name"] and current_login["password"]:
61                 res = func(*args,**kwargs)
62                 return res
63             if auth_type == "file":
64                 main()
65                 res = func(*args,**kwargs)
66                 return res
67             if auth_type == "ldap":
68                 print("还他妈不会玩")
69         return wrapper
70     return auth
71 
72 
73 @auth2(auth_type="file")
74 def index():
75     print("welcome beijing! ")
76 
77 index()
详细代码

 



 

定义有参装饰器为被装饰函数添加认证功能,定义有参装饰器为被装饰函数添加认证功能,三次验证失败锁定用户