要求:
1)输入用户名密码
2)认证成功后显示欢迎信息
3)输错三次后锁定
程序可实现功能:
1)在实现上述三个要求的基础上,同时利用用户名单信息user_info.txt和黑名单lock_list.txt 实现用户的正常登陆和异常登陆锁定(某用户输错次数=运行一次程序中输入密码错误次数的累加),其中账号输错,不算在输错次数中;
2)用户可随时修改用户名单和黑名单,灵活应用此程序(在黑白名单的数量上没有限制)
缺点:直接按两次enter 程序报错 后期再改
具体代码如下所示:
'''
Created on
@author: hcl
'''
def load_dataSet(fileName):
#用于提取所有名单内账号密码
#返回用户账号 密码 错误输入次数
usr_name = [];usr_passWord = [];err_inputCount = {}
with open(fileName) as fr:
for line in fr.readlines():
lineArr = line.strip().split('\t')
usr_name.append(lineArr[0])
usr_passWord.append(lineArr[1])
err_inputCount.update({lineArr[0]:0})
return usr_name,usr_passWord,err_inputCount
def chek_lockList(usr_name,lock_list):
#用于确认usr_name是否存在于黑名单lock_list中
listName = []
with open(lock_list) as fr:
for line in fr.readlines():
lineArr = line.strip().split('\t')
listName.append(lineArr[0])
for i in range(len(listName)):
if usr_name == listName[i]:
return True
else:
return False
def check_user(input_name,input_password,usr_name,usr_password,lock_list,err_inputCount,err_input_count_limit = 3):
#实现用户账号密码的监测 实现异常登陆检测 超过三次加入黑名单lock_list,且黑名单内不会自动加入重复账户名
while(err_inputCount[input_name] < err_input_count_limit and not chek_lockList(input_name,lock_list)):
for i in range(len(usr_name)):
if input_name == usr_name[i]:
if input_password == usr_password[i]:
print("Welcome to the new world!...")
return
else:
err_inputCount.update({input_name:err_inputCount[input_name]+1})
print("%s err_count is %s" %(input_name,err_inputCount[input_name]))
break
else:
print("Don't exist the %s !!!" %input_name)
break
if err_inputCount[input_name] < 3:
input_name = input('Please input your username:')
input_password = input('Please input your password:')
else:
print("账号: %s 已被锁定,请联系后台管理人员修改黑名单" %input_name)#锁定操作
if not chek_lockList(input_name,lock_list):
with open(lock_list,"a+") as fr:
fr.write(input_name + '\n')
#根据用户名单信息文件存放位置 修改user_info 存放路径
user_info = r"F:\eclipse-workspace\algorithm\src\Python Train Data\user_info.txt"
#根据黑名单信息文件存放位置 lock_list 存放路径
lock_list = r"F:\eclipse-workspace\algorithm\src\Python Train Data\lock_list.txt"
#获取用户信息账户信息
usr_name,usr_password,err_inputCount = load_dataSet(user_info)
#print(usr_name,usr_password,err_inputCount)
input_name = input('Please input your username:')
input_password = input('Please input your password:')
#检测用户账号密码
check_user(input_name,input_password,usr_name, usr_password,lock_list,err_inputCount)
同时提供用户名单信息user_info.txt,分别为 账户、密码、错误输入次数 ,行间用一个tab距离做分隔符
hcl 123 0
ln 456 0
hn 789 0
黑名单lock_list.txt
hcl
hn