連續三次登陸失敗鎖定賬戶
阿新 • • 發佈:2018-03-24
管理員 post 退出 getpass 信息 循環讀取 serve 驗證 pre
連續三次登錄失敗鎖定賬戶
需求說明:
1、輸入用戶名
2、認證成功,提示登錄成功,歡迎信息
3、登錄失敗連續三次,提示失敗,並退出程序
備註:
1、users_info是存放用戶名及其密碼的文件,格式: 用戶名 密碼, 之間用空格隔開
2、locked_file是存放被鎖定的用戶id的文件,默認為空,格式為: 用戶名
3、程序會對users_info裏的合法用戶id進行判斷,若連續三次輸入錯誤,提示失敗並退出
4、程序會對正確的用戶名後的密碼進行驗證,輸入三次密碼錯誤,鎖定該用戶名,並退出
思路導圖:
一、代碼如下
#!/usr/bin/env python3 # -*- coding:utf-8 -*- #View CodeAuthor: davie # file three_login.py """ 需求說明: 1、輸入用戶名 2、認證成功,提示登錄成功,歡迎信息 3、登錄失敗連續三次,提示失敗,並退出程序 備註: 1、users_info是存放用戶名及其密碼的文件,格式: 用戶名 密碼, 之間用空格隔開 2、locked_file是存放被鎖定的用戶id的文件,默認為空,格式為: 用戶名 3、程序會對users_info裏的合法用戶id進行判斷,若連續三次輸入錯誤,提示失敗並退出 4、程序會對正確的用戶名後的密碼進行驗證,輸入三次密碼錯誤,鎖定該用戶名,並退出 """ import os,sys,getpass #導入os,sys,getpass 模塊 os.system(‘clear‘) # 清屏操作 count = 0 # 用戶輸入循環次數 while count < 3: # 只要用戶登錄失敗不超過3次,就就行循環執行 username = input("請輸入您的用戶名: ").strip() # 輸入用戶名 # 打開locked_file文件,權限是讀寫,並賦值給locked_f變量 locked_f = open(‘locked_file‘,mode=‘r+‘,encoding=‘utf-8‘) #使用.readlines()的方法逐行讀取locked_file文件,並賦值給locked_list變量 locked_list = locked_f.readlines() # 使用for循環讀取locked_file的內容 for locked_line in locked_list: # 使用.strip()的方法去掉換行符 locked_line = locked_line.strip(‘\n‘) # 判斷用戶輸入的信息是否在locked_file中存在 if username == locked_line: print("用戶:\033[31m%s\033[0m 已經鎖定,請聯系您的管理員" % username) # 如果存在則打印 sys.exit(1) # sys模塊的exit()方法表示退出 with open("users_info",mode="r",encoding="utf-8") as user_f: # 只讀模式打開文件 user_list = user_f.readlines() # 使用.readlines()方法逐行讀取,賦值給變量 for user_line in user_list: # 使用for循環讀取users_info的內容 (user,passwd) = user_line.strip(‘\n‘).split() # 分別獲取賬號和密碼信息 if username == user: # 使用if判斷用戶輸入的賬號是否在users_info中存在 p_count = 0 # 輸入密碼的循環次數 while p_count <3: # 循環不超過三次 password = getpass.getpass("請輸入密碼: ") # 使用getpass方法,密碼不顯示 if password == passwd: # 用戶名和密碼都正確 print("\033[36m歡迎您,登陸成功!\033[0m") sys.exit(0) else: if p_count != 2: # p=2時,是最後一次機會 print("對不起,\033[31m%s\033[0m的密碼錯誤,請繼續輸入,你還有\033[31m%d\033[0m次機會"%(username,2-p_count)) p_count += 1 else: pass # 用戶匹配失敗,跳過並繼續循環 else: locked_f.write(username + ‘\n‘) sys.exit("對不起 \033[31m%s 用戶已經被鎖定,請聯系管理員\033[0m"% username) u += 1 else: sys.exit("\033[31輸入有誤,程序退出,請重新輸入!\033[0m") locked_f.close() # 關閉文件
二、運行結果
[davie@webserver ~]$ ll total 8 -rw-rw-r-- 1 davie davie 0 Mar 23 20:54 locked_file -rw-rw-r-- 1 davie davie 3312 Mar 23 20:53 three_login.py -rw-rw-r-- 1 davie davie 30 Mar 23 20:24 users_info [davie@webserver ~]$ cat users_info u1 123456 u4 123456 u5 123456 [davie@webserver ~]$ python3 three_login.py 請輸入您的用戶名: u1 請輸入密碼: 對不起,u1的密碼錯誤,請繼續輸入,你還有2次機會 請輸入密碼: 對不起,u1的密碼錯誤,請繼續輸入,你還有1次機會 請輸入密碼: 對不起 u1 用戶已經被鎖定,請聯系管理員 [davie@webserver ~]$ [davie@webserver ~]$ cat locked_file u1 [davie@webserver ~]$ [davie@webserver ~]$ python3 three_login.py 請輸入您的用戶名: u2 對不起 u2 用戶已經被鎖定,請聯系管理員 [davie@webserver ~]$ ll total 12 -rw-rw-r-- 1 davie davie 6 Mar 23 21:42 locked_file -rw-rw-r-- 1 davie davie 3312 Mar 23 20:53 three_login.py -rw-rw-r-- 1 davie davie 30 Mar 23 20:24 users_info [davie@webserver ~]$ cat locked_file u1 u2 [davie@webserver ~]$ python3 three_login.py 請輸入您的用戶名: u3 對不起 u3 用戶已經被鎖定,請聯系管理員 [davie@webserver ~]$ python3 three_login.py 請輸入您的用戶名: u4 請輸入密碼: 歡迎您,登陸成功! [davie@webserver ~]$View Code
連續三次登陸失敗鎖定賬戶