Python--简单的用户管理系统

Python--简单的用户管理系统

这个小程序是关于《Python核心编程》第七章练习解析中的第五题,由于程序略微繁琐,我就单独拿出来写。

题目描述

userpw2.py。下面的问题和例题7.1中的管理名字-密码的键值对数据程序有关。

(a) 修改那个脚本,使他能记录用户上次的登陆日期和时间(用time模块),并与用户密码一起保存起来。程序的界面要求用户输入用户名和密码的提示。无论用户名是否登陆成功,都应有提示,在用户登陆成功后,应更新相应用户的上次登陆时间戳。如果本次登陆与上次登陆在时间上相差不超过四个小时,则通知该用户:“You already in at :<last_login_timestamp>”。

(b) 添加一个管理菜单,其中有以下两项:(1)删除一个用户 (2)显示系统中所有用户的名字和他们密码的清单。

(c) 口令目前没有加密。请添加一段对口令加密的代码

(d) 为程序添加图形界面,例如,用Tkinter。

(e) 要求用户名布区分大小写。

(f ) 加强对用户名的限制,不允许符号和空白符。

(g) 合并“新用户”和“老用户”两个选项。如果一个新用户试图用一个不存在的用户名登陆,询问该用户是否是新用户,如果是肯定的,就创建该用户。否则按老用户的方式登陆。


由于图形界面过于繁琐,本程序没有实现,以后有时间再详细研究。另外本程序添加了一些新的功能:

(1) 密码修改:修改密码时必须验证旧密码

(2) 超级管理员认证机制:删除用户及显示所有用户信息必须有超级管理员权限

(3) base64+md5双层加密

(4) 在本程序同目录下生成user.ini、time.ini配置文件


程序中用到的模块解释如下:

(1) re:正则表达式引擎,Python中调用正则表达式的方法

(2) pickle:对象持久化,将数据写入到磁盘中

(3) datetime:时间处理,用于记录用户登陆时间戳

(4) base64:base64加密模块

(5) hashlib:hash加密模块


程序代码


#-*- coding:utf-8 -*-
#2015-04-05

import re
import pickle
import base64,hashlib
from datetime import datetime   

def Initialization(file_name):
    '''程序初始化,创建user.ini和time.ini文件'''
    dict_test={'admin':'db69fc039dcbd2962cb4d28f5891aae1'}  #创建超级管理员,默认密码为admin
    f = file(file_name,'a+')   #以追加的方式打开文件,避免文件被修改
    if len(f.readlines()) ==0:  #判断程序是否为空,只在第一次运行的时候初始化
        if file_name=='user.ini':
            pickle.dump(dict_test, f, True)
        else:
            pickle.dump({},f, True)
    f.close()

def encodepass(passwd):
    '''采用base64和md5双层加密,破解可能几乎为0'''
    m = hashlib.md5()
    pwd = base64.b64encode(passwd)
    m.update(pwd)
    return m.hexdigest()

def time_order(user):
    '''记录用户登陆时间,结果保存在time.ini文件中'''
    ft = file('time.ini','r')
    dbt = pickle.load(ft)
    if user not in dbt:
        dbt.setdefault(user,datetime.today())
    else:
        time_value = dbt[user]
        t = datetime.today()-time_value
        try:
            if t.hour<=4:
                print 'You already logged in at:<last_login_timestamp>'
        except:
            print 'You already logged in at:<last_login_timestamp>'
        dbt[user] = datetime.today()
    ft = file('time.ini','w')
    pickle.dump(dbt, ft, True)
    ft.close()
        

def newuser(db):
    '''用户创建程序,由olduser调用'''
    while True:
        name = raw_input('Please input the username:')
        if re.match(r'\w', name):   #采用正则表达式检测用户名是否合法
            pass
        else:
            print 'Username should be made of A~Z、a~z、0~9、_'
            continue
        for valuename in db.keys():
            if name.lower() == valuename.lower():
                break
        else:
            break
    passwd = raw_input('Please input the password:')
    db[name] = encodepass(passwd)
    
def olduser(db):
    '''用户登陆程序'''
    name = raw_input('Login:')
    if name in db:
        pwd = raw_input('passwd:')
        passwd = db.get(name)
        if passwd == encodepass(pwd):
            print 'Welcome back!',name
            time_order(name)
        else:
            print 'Login incorrent!'
    else:
        YN = raw_input('Do you want to instead a new user? Yes or No:')
        if YN.lower()=='yes':
            newuser(db)
    print '\n',
        
def deluser(db):
    '''删除一个用户,但必须以管理员的身份'''
    print 'Please login as admin'  #管理员的身份才能删除用户
    name = raw_input('Login:')
    pwd = raw_input('passwd:')
    passwd = db.get(name)
    if passwd == encodepass(pwd) and name=='admin':
        user = raw_input('Please input a user name:')
        if user != 'admin':
            if db.pop(user):
                print 'Delete Current!'
        else:
            print 'Con not delete admin!'
    else:
        print 'Wrong passwprd'
    
def checkuser(db):
    '''查看所有用户,但必须以管理员的身份'''
    print 'Please login as admin'  #管理员的身份才能查看所有用户
    name = raw_input('Login:')
    pwd = raw_input('passwd:')
    passwd = db.get(name)
    if passwd == encodepass(pwd) and name == 'admin':
        for key in db:
            print 'username: %10s ====> password: %10s' % (key,db[key])
    else:
        print 'You can not check all users!'

def resetuser(db):
    '''修改密码,但必须正确的输入老密码'''
    name = raw_input('Please input the username:')
    passwd  = raw_input('Please input old password:')
    if db[name] == encodepass(passwd):
        passwd = raw_input('Please input new password:')
        db[name] = encodepass(passwd)
    else:
        print 'Wrong password!'

def showmenu():
    '''程序运行的主函数'''
    fu = file('user.ini','r')
    db = pickle.load(fu)
    prompt = '''(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:'''
    
    done = False
    while not done:
        chosen = False
        while not chosen:
            try:
                choice = raw_input(prompt).split()[0].lower()
            except (EOFError,KeyboardInterrupt):
                choice = 'q'
            print '\nYou picked:[%s]' % choice
            if choice not in 'lqdcr':
                print 'invalid option,try again'
            else:
                chosen = True
                    
        if choice == 'q':done = True
        if choice == 'l':olduser(db)
        if choice == 'd':deluser(db)
        if choice == 'c':checkuser(db)
        if choice == 'r':resetuser(db)
        
    fu = file('user.ini','w')
    pickle.dump(db,fu,True)
    fu.close()
        
        
if __name__ == '__main__':
    '''系统有一个用户名为admin 密码为admin的超级用户,请立即修改密码!'''
    print 'Welcome to User Information Management System!'
    Initialization('user.ini')
    Initialization('time.ini')
    showmenu()
    

运行结果

Welcome to User Information Management System!
(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:l

You picked:[l]
Login:admin
passwd:admin
Welcome back! admin

(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:l

You picked:[l]
Login:123
Do you want to instead a new user? Yes or No:yes
Please input the username:123
Please input the password:123

(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:l

You picked:[l]
Login:123
passwd:123
Welcome back! 123

(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:r

You picked:[r]
Please input the username:123
Please input old password:123
Please input new password:456
(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:l

You picked:[l]
Login:123
passwd:456
Welcome back! 123
You already logged in at:<last_login_timestamp>

(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:c

You picked:[c]
Please login as admin
Login:admin
passwd:admin
username:      admin ====> password: db69fc039dcbd2962cb4d28f5891aae1
username:        123 ====> password: 1049d8043c9179e066f96479e4598e73
(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:d

You picked:[d]
Please login as admin
Login:admin
passwd:admin
Please input a user name:123
Delete Current!
(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:c

You picked:[c]
Please login as admin
Login:admin
passwd:admin
username:      admin ====> password: db69fc039dcbd2962cb4d28f5891aae1
(L)ogin Now
(Q)uit
(D)elet User
(C)heck All User
(R)eset Password
Enter choice:q

You picked:[q]

程序由个人完成,如有疏漏还请谅解指导!

参考文献

(1) 正则表达式30分钟入门教程

(2) Python pickle模块

(3) Python的datetime常用几个操作

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值