python练习_简单登录
2017-01-13 13:49
507 查看
python练习_简单登录
需求:做一个登录的小程序,验证用户与密码
要求登录三次错误后锁定
以下代码实现的功能与思路:
功能:
1、除admin以外的用户累计登录失败次数超过三次则锁定,此时需要管理员解锁。
2、当前IP地址登录失败五次则锁定IP地址一分钟后解锁。
3、admin管理员有以下管理功能 锁定用户、解锁用户、更改密码、添加用户、删除用户。
4、普通用户拥有更改密码的功能。
流程图:
[b]
#!/usr/bin/env python # -*- coding:utf-8 -*- import time import ConfigParser import socket import webbrowser import sys import getpass # 全局变量 localIP 获取本地ip用于锁定本地ip,user_config操作用户文件句柄 LOCAL_IP = socket.gethostbyname(socket.gethostname()) user_config = ConfigParser.ConfigParser() user_config.read('userdb') class Admin_function(object): ''' admin管理员功能类 ''' def __init__(self): pass def Admin_function_main(self): ''' 调用函数,根据输入指令调用类中的相关功能 ''' while True: print(''' -------------Operation menu------------ Change password:pas Unlocked:lc Lock the user:ul Add user:in Delete user:rm Exit:exit --------------------------------------- ''') admin_operation = raw_input("Please enter an action:") if admin_operation == "pas": self.pas_reset() elif admin_operation == "lc": self.counter_tag = 0 self.unlock_lock_user() elif admin_operation == "ul": self.counter_tag = 3 self.unlock_lock_user() elif admin_operation == "in": self.user_app_del = "in" self.add_del_user() elif admin_operation == "rm": self.user_app_del = "rm" self.add_del_user() elif admin_operation == "exit": sys.exit() else: print("Input Error") def users(self): ''' 判断admin输入用户是否存在 ''' while True: self.userlist = user_config.sections() print("------------Current user-------------") for single_user in self.userlist: print(" %s"%single_user) print("-------------------------------------") self.admin_inuser = raw_input("Please enter a user:") if self.admin_inuser in self.userlist: break else: print("User does not exist") def unlock_lock_user(self): ''' 锁定与解锁,主要更改usedb中的counter项,如果用户输入admin则不执行操作 ''' self.users() if self.admin_inuser == "admin": print("This action is not valid for admin") else: user_config.set(self.admin_inuser,'counter',self.counter_tag) user_config.write(open('userdb', "w")) if self.counter_tag == 0 : print_str = "Unlock" else: print_str = "locking" print("User %s is %s"%(self.admin_inuser,print_str)) def pas_reset(self): ''' 更改密码函数,用于更改用户和admin的密码,密码最小长度不能低于8位,此处可以增加 复杂度判断,主要更改userdb中的password字段 ''' self.users() admin_inpas = raw_input("Please enter a reset password (no less than 8 digits):") if len(admin_inpas) > 7: print("The password has been reset to:%s"%(admin_inpas)) user_config.set(self.admin_inuser,'password',admin_inpas) user_config.write(open('userdb', "w")) else: print("Password length is less than 8 digits Please re-enter") def add_del_user(self): ''' 增删用户操作,增加用户时判断用户是否存在,不存在则添加, 并输入设定用户密码,同样不能少于八位(可增加密码复杂度判断)对admin无效 删除用户时,对用户进行判断,存在则删除,对admin无效 ''' userlists = user_config.sections() print("------------Current user-------------") for single_user in userlists: print(" %s"%single_user) print("-------------------------------------") add_name = raw_input("Please enter a user:") if add_name == 'admin': print("This action is not valid for admin") else: if self.user_app_del == "in": if add_name in userlists: print("User already exists") else: while True: add_inpas = raw_input("Please enter a password(no less than 8 digits):") if len(add_inpas) > 7: user_config.add_section(add_name) user_config.set(add_name,'password',add_inpas) user_config.set(add_name,'counter',"0") user_config.write(open('userdb', "w")) print("The[%s] user creation is complete"%add_name) break elif add_inpas == "exit": break else: print("Password length is less than 8 digits Please re-enter") else: if add_name in userlists: user_config.remove_section(add_name) user_config.write(open('userdb', "w")) print("[%s]User deleted"%add_name) else: print("User does not exist") class user_function(object): ''' 普通用户功能类 self.user 封装传入的用户 ''' def __init__(self,inuser): self.user = inuser def user_main(self): ''' 调用功能的函数 ''' while True: print(''' -----------Operation menu----------- Change password:pas Exit:exit ------------------------------------ ''') user_main_in = raw_input("Please enter an action:") if user_main_in == "pas": self.pas_reset() elif user_main_in == "exit": sys.exit() else: print("Input Error") def pas_reset(self): user_inpas = raw_input("Please enter a reset password (no less than 8 digits):") if len(user_inpas) > 7: print("The password has been reset to:%s"%user_inpas) user_config.set(self.user,'password',user_inpas) user_config.write(open('userdb', "w")) else: print("The password is less than 8 digits long") def for_count(): ''' 主调函数,在执行前调用ip_Locking_verify()函数,用于IP锁定验证 当用户登录错误次数超过五次后将锁定ip地址,一分钟后开放并获取当前时间的时间戳, 传入in_lock函数中;当条件正常的时候,传入用户验证函数 ''' user_count = 0 while True: lock_times = time.time() new_lock_times = str(lock_times).split('.')[0] ip_Locking_verify(new_lock_times) user_certification() user_count += 1 if user_count == 5: ip_lock(new_lock_times) print("Maximum login limit, see a video, please log in again after 1 minute") time.sleep(1.5) webbrowser.open("https://v.qq.com/x/page/i0014jfvo9j.html",new=0,autoraise=True) sys.exit() def user_certification(): ''' user certification(用户认证) 用户验证成功后,进行密码验证,admin用户不计算在次数锁定条件中 ''' times = time.strftime("%H:%M:%S",time.localtime(time.time())) user_in = raw_input("login user [%s] :"%times) user_list = user_config.sections() if user_in in user_list: if user_in == "admin": user_state = "0" else: user_state = user_config.get(user_in,"counter") if int(user_state) < 3: password_ertification(user_in) else: print("User is locked Please contact the administrator to unlock") else: print("User name wrong") def password_ertification(user): ''' 密码验证,失败则保持用户文件中登录次数增加1当到达三次后则锁定 密码验证成功后进入用户菜单,并清除登录计数 linux启用getpass输入密码不显示 ''' password_in = raw_input("login password :") # password_in = getpass.getpass("login password :") user_password = user_config.get(user,"password") if password_in == user_password: user_config.set(user,'counter',0) user_config.write(open('userdb', "w")) if user == 'admin': admin_class = Admin_function() admin_class.Admin_function_main() else: user_class = user_function(user) user_class.user_main() else: if user == 'admin': print("Password mistake") else: user_counter = user_config.get(user,"counter") counter_value = int(user_counter) + 1 user_config.set(user,'counter',str(counter_value)) user_config.write(open('userdb', "w")) print("Password mistake") def ip_lock(in_lock_times): ''' IP锁定,触发此函数,将把ip和当前你时间戳记录到iplist文件中 ''' with open('iplist','a') as ip_lock_in: lock_in_content = "%s:%s\n"%(LOCAL_IP,in_lock_times) ip_lock_in.write(lock_in_content) def ip_Locking_verify(time_stamp): ''' 验证当前ip是否被锁定,符合则解锁时间则解锁 通过iplist文件进行判断,程序执行时会读取现在的时间戳 然后减去记录在文件中的时间戳,如果大60则将条目删除,否则输出解锁时间 ''' ip_list = [] with open('iplist','rU')as main_iplist : for lock_ip in main_iplist.readlines(): ip_list.append(lock_ip) if LOCAL_IP in lock_ip: new_ip_Locking = str(lock_ip).split(':')[1] if int(time_stamp) - int(new_ip_Locking) > 60: ip_list.remove(lock_ip) print("The current IP[%s] is unlocked"%LOCAL_IP) else: remaining_time = 60 - (int(time_stamp) - int(new_ip_Locking)) print("The current IP[%s] is locked,Remaining unlock time [%s] seconds"%(LOCAL_IP,remaining_time)) sys.exit() open_iplist = open("iplist", "w+") if ip_list: open_iplist.writelines(ip_list) else: open_iplist.writelines("") open_iplist.close() if __name__ == '__main__': for_count()
登录代码
user存储用户数据的格式
[admin] password = admin.123 counter = 0 [test] password = admin.123 counter = 0 [test1] password = admin.123 counter = 3
创建一个叫iplist的文件,到此即可正常运行
相关文章推荐
- Python小练习 - 用字典编写简单的注册、登录程序
- python实现的简单用户注册登录系统
- 黑马程序员-简单的登录练习
- Python Tkinter 简单登录界面
- 简单爬虫实现登录新浪微博(python2.7)
- Python实现简单的用户登录
- 用简单登录,练习asp.net
- Python模拟登录验证码(代码简单)
- 学习SSH时的练习demo,实现分页和登录等简单功能
- python2.7练习 写一个简单的文本编辑器
- python练习之编写登录接口
- python学习之最简单的用户注册及登录验证小程序
- 简单登录,退出系统,练习
- 简单登录,退出系统,练习
- 一个简单的python练习
- Python小练习-自动登录人人发送消息并返回好友列表
- python之简单POST模拟登录
- python实现简单爬虫模拟登录淘宝(cookie简介)
- 【Python】Learn Python the hard way, ex35 通过一个简单游戏,练习循环和分支语句
- Python简单登录密码比对