python练习_简单登录
python练习_简单登录
需求:
- 做一个登录的小程序,验证用户与密码
- 要求登录三次错误后锁定
以下代码实现的功能与思路:
功能:
1、除admin以外的用户累计登录失败次数超过三次则锁定,此时需要管理员解锁。
2、当前IP地址登录失败五次则锁定IP地址一分钟后解锁。
3、admin管理员有以下管理功能 锁定用户、解锁用户、更改密码、添加用户、删除用户。
4、普通用户拥有更改密码的功能。
流程图:

思路:
1、用户信息通过ConfigParser模块进行处理并保存到文件
2、通过保存文件中counter 判断登录失败次数
3、通过socket获取当前计算机IP,如果失败把IP记录到文件中,并加入通过time获取的当前时间戳
4、管理功能通过ConfigParser模块中的一些功能处理存储用户信息的文件即可
代码Python2.7执行环境:
使用方式:
在linux上直接运行main.py即可
windows运行请把 225行解除注释,把226行注释
测试账号:
用户admin 密码:admin.123
用户test 密码:admin.123
用户test1 密码:admin.123 test1 默认锁定状态
#!/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',"")
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 = ""
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第一天-----简单登录验证
----------------------------------------- 编写登录接口 要求:1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 -------------- ...
- python爬虫_简单使用百度OCR解析验证码
百度技术文档 首先要注册百度云账号: 在首页,找到图像识别,创建应用,选择相应的功能,创建 安装接口模块: pip install baidu-aip 简单识别一: 简单图形验证码: 图片: from ...
- 测试开发Python培训:模拟登录新浪微博-技术篇
测试开发Python培训:模拟登录新浪微博-技术篇 一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- Python实现ssh批量登录并执行命令
局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的.现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件 ...
- Python爬虫之模拟登录微信wechat
不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一起.既然它这么重要,如果我们可以利用爬虫模拟登录,是不是就意味着我们可以获取这些信息 ...
- python之Flask实现登录功能
网站少不了要和数据库打交道,归根到底都是一些增删改查操作,这里做一个简单的用户登录功能来学习一下Flask如何操作MySQL. 用到的一些知识点:Flask-SQLAlchemy.Flask-Logi ...
- Struts1入门实例(简单登录)
Struts1入门实例(简单登录) 现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技术不是很新潮,前台用的还是struts1. 虽然不是什么新技术,但仍可以从中学到好多东西的.花了一个晚 ...
- python基础_格式化输出(%用法和format用法)(转载)
python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...
随机推荐
- SVN 创建仓库操作
服务端安装完成后 1.创建一个存放仓库的文件夹(这里在home目录创建) #mkdir svnRepo #cd svnRepo/ 创建一个仓库 (写全路径) # svnadmin create /ro ...
- 炒美股史考特(Scottrade)开户准备及如何获取免费交易(最新2017版)
最新美股史考特(Scottrade)开户及汇款攻略 (2017 年 6 月) 一 前言 二 开户流程 三 激活账户 四 转账汇款 五 小结 一 前言:为什么选择史考特(Scottrade ...
- Java基础IO流
流 流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.IO流最终要以对象来体现,对象都存在IO包中. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流 ...
- NOJ1167 丑陋数 想法题
题意 丑陋数n的意思是n的全部素数因子仅仅有2,3,5. 求出前1500个丑陋数. (第一个丑陋数是1) 思路 用一个数组维护全部的丑陋数. 一開始数组中仅仅有一个数就是1. 如今能够确定的丑陋数还有 ...
- CentOS 源码安装svn
一. 下载依赖包 1. apr源码包 http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.5.2.tar.gz 2. apr-util源码包 h ...
- 通俗的解释下音视频同步里pcr作用
PCR同步在非硬件精确时钟源的情况还是谨慎使用,gstreamer里面采用PCR同步,但是发现好多ffmpeg转的片儿,或者是CP方的片源,pcr打得很粗糙的,老是有跳帧等现象.音视频同步,有三种方法 ...
- uitableview滚动到最后一行
本文转载至 http://mrjeye.iteye.com/blog/1278521 - (void)scrollTableToFoot:(BOOL)animated { NSInteger s = ...
- 做完task1-21的阶段总结
[说明]这是自注册修真院的第七天,也是第七篇日报,觉得是一个好的时机总结一下. 因为任务一虽然看起来仅仅是“完成学员报名的DB设计并读写数据库”,但是做了几天之后就发现在任务“搭建自己的服务器”之前的 ...
- Java学习笔记——java介绍
Java开源语言 C语言闭源语言 IOS闭源系统 采用object-c语言开发 应用程序分类(从类型分类) C/S(Client Server):不联网的软件也属于C/S B/S(Browser S ...
- EasyNVR无插件摄像机直播之:摄像机网页低延时无插件直播实现
背景需求 对于摄像机直播,客户反馈的最多就是实现web直播.摆脱插件,可以自定义集成等问题, 对于熟悉EasyNVR已经完美的解决了这些问题.然而对于web播放也存在一些问题,通常我们web播放RTM ...