python 登录接口三次锁定 更新版
Readme:
运行程序流程详解
1、 程序运行开始后,会提示欢迎信息,要求用户输入用户名
2、首先程序会对黑名单里的锁定用户id进行判断,若在黑名单中存在,直接提示用户锁定,并且退出
3、用户名在黑名单中不存在,程序会对白名单里的合法用户id进行判断,若连续输入用户id错误达三次程序会调用注册函数,用户注册成功后直接退出(注册用户时,当用户输入后程序会检查用户输入的ID在白名单中是否存在,存在会提示重新输入,不存在则跳到第4步)
4、用户名输入正确,提示输入密码,程序会对正确用户名后的密码进行判断,输入密码有3次机会,在进入第二次密码输入的时候会提示验证码的输入,验证码输入错误,一直提示,密码连续三次错误则会锁定用户id并且退出.
5、当用户名和密码都正确,程序会提示登录成功,并且会输出登录时间,并把登录的用户名和登录时间输出到一个login_time_log的文件中
PS:
1、white_list是白名单文件,存放的是正常的用户和密码
2、black_list是黑名单文件,存放的是已经锁定的用户(默认为空)
3、login_time_log是用户登录日志文件(默认为空)
Flow chart:

代码:
#!/usr/bin/env python # _*_ coding: utf-8 _*_ # @Time : 2017/1/8 17:55 # @Author : zjz10 # @File : login.py # @Software: PyCharm # @EMAIL 18301597972@163.com # ----------------------------------------------------- # 导入模块 import sys,os,getpass,random import datetime,hashlib # 清理屏幕 os.system('cls') # Windows中的方法 # os.system('clear') # Linux系统中的方法 # 记录成功登录用户的时间 def usertime(): login_time = str(datetime.datetime.now()) # 使用datetime模块获取当前时间,转换成str赋值给login_time变量 print('用户 %s 登录时间是:%s' %(name,login_time)) # 打印输出登录的时间 with open('login_user_time','a+') as time_user: # 以追加的权限打开一个login_user_time的文件(文件存在追加,不存在创建) time_user.write('User %s Login time is: %s' %(name,login_time) + '\n') # 将数据写入到文件中 # 注册用户的函数 def register(): new_wl_user = open('white_list','r') new_wl_list = new_wl_user.readlines() new_wl_user.close() for new_wl_line in new_wl_list: (new_user, new_passwd) = wl_line.strip('\n').split() while True: new_username = input('请输入注册用户名:') if new_username == new_user: print('用户名已经存在,请重新输入') continue else: new_password = getpass.getpass('请输入新用户密码:') # 使用getpass模块输入密码是密文输入 break while True: new_password_again = getpass.getpass('请再次确认新用户密码:') # 再次确认密码 if new_password_again != new_password: # 密码错误则循环 continue else: break # 正确则跳出循环执行下一个循环 account_information = "%s %s" % (new_username, new_password) with open('white_list', 'a+') as file: # 把用户信息存入白名单,a+为读写追加模式 file.write(account_information + '\n') # 写入并换行 decoration1 = '' print(decoration1.center(50,'-')) print(("恭喜你注册成功,用户名密码是>>: %s ") % (account_information)) print("请重新登录你的账号") print(decoration.center(50,'-')) # 生成验证码函数 def generate_verification_code(len=4): code_list = [] # 定义一个空的列表 for i in range(10): # 使用for循环循环0-9的数字并赋值个i(这里的10表示0--9的数字) code_list.append(str(i)) # 将0--9以字符串的方式使用.append方法添加到上面定义的空列表 for i in range(65,91): # 使用for循环循环0-9的数字并赋值个i(这里的65,91是表示ASCII码中的A--Z) code_list.append(chr(i)) # 将A--Z以字符串的方式使用.append方法添加到上面定义的空列表 for i in range(97,123): # 使用for循环循环0-9的数字并赋值个i(这里的97,123是表示ASCII码中的a--z) code_list.append(chr(i)) # 将a--z以字符串的方式使用.append方法添加到上面定义的空列表 slice = random.sample(code_list, len) # 从列表中随机获取4个元素,作为一个片断返回 verification_code = ''.join(slice) # 列表转换成字符串的形式存放到verification_code变量中 return verification_code # 输出verification_code # 输入验证码函数 def verification_code(): while True: code = generate_verification_code(4) # 将最后得到的4为组合的验证码赋值给code print('验证码是>>:' + code) print('-------------------------------------') verification = input('请输入验证码>>:') print('-------------------------------------') if verification == code: # 如果输入的验证码正确,正常跳出循环,执行下一个循环 break # 正确则跳出整个循环执行下一个循环 else: # 如果输入错误,提示用户 print('验证码输入错误,请重新输入') continue # 终止当前循环,并且跳出当前循环,进入下一个循环 # 程序开始 login = 0 # 用户的循环次数 while login < 3: # 只要用户登录异常不超过3次就不断循环 decoration = '' print(decoration.center(50,'-')) print('欢迎访问身份验证系统,请输入您的信息') print(decoration.center(50,'-')) name = input('请输入您的用户名>>:') # 使用input实现用户输入,并且赋值给name变量 bl_user = open('black_list','r+') # 打开黑名单文件,权限是读取更新 bl_list = bl_user.readlines() # 使用.readlines()方法逐行读取 for bl_line in bl_list: bl_line = bl_line.strip('\n') # 使用.strip()的方法去掉换行符 if name == bl_line: # 判读用户输入的用户名是否在黑名单存在(存在提示锁定,并退出) print('您的用户 %s 已经锁定,请联系您的管理员' %(name)) sys.exit() with open('white_list','r') as wl_user: # 打开白名单文件,权限是只读,赋值给wl_user wl_list = wl_user.readlines() # 使用.readlines()方法逐行读取 for wl_line in wl_list: (user,passwd) = wl_line.strip('\n').split() # 分别获取用户名和密码信息 if user == name: # 判断用户输入的用户是否在白名单中存在 pwd = 0 # 输入密码的循环次数 while pwd < 3: # 只要用户输入密码错误不超过3次就不断循环 password = getpass.getpass('请输入您的密码>>:') # 使用getpass模块的.getpass方法让用户输入密码(密文输入) if password == passwd: # 判断输入的密码是否在白名单中存在 print('您已经通过验证,欢迎 %s 登录身份验证系统'%(name)) # 用户名和密码全部相等,提示登录成功 usertime() sys.exit() # 退出 else: if pwd != 2: # pwd=2时,是最后一次机会,不用在提示还剩余0次机会了 print('对不起,%s 的密码错误,请重新输入,你还有 %d 次机会' % (name, 2 - pwd)) print('-------------------------------------') print('请输入验证码进行验证') # print('验证错误') verification_code() # 调用验证码函数 pwd += 1 # 密码输入错误后,循环值增加1 else: bl_user.write(name + '\n') # 密码3次输入错误,写入到黑名单 bl_user.close() # 关闭文件 sys.exit('非常抱歉,您输入的密码次数已经超过上限,用户 %s 已经锁定,请联系管理员'%(name)) else: pass else: if login != 2: # login=2时,是最后一次机会,不用在进行提示还剩余多少机会 print('对不起,%s 输入错误,请重新输入,你还有 %d 次机会' %(name,2 - login)) login += 1 # 用户输入错误后,循环值增加1 else: pass # 用户输入用户名3次错误后执行下面代码 new_name = input('您输入的用户 %s 不存在,是否需要注册y or n >>:' %(name)) # 提示用户是否注册 while True: if new_name == 'y': # 用户输入y register() # 调用注册函数 break # 正确则跳出整个循环执行下一个循环 else: # 用户输入n sys.exit() # 退出程序
注:代码还有待优化,仅供参考
朱敬志(brian),成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。

浙公网安备 33010602011771号