Python模拟用户验证的程序
写在前面的
每一个系统,第一步操作基本都是先用户登录。登录后,在用户使用相应功能时,都需要先验证用户权限,再显示相应权限范围内的信息。这样才能保证用户不会越权使用系统。
用户登录验证的方式很多,但想起来简单,做起来也不难,但做好似乎又不是那么容易。
这里就以一个简单的代码结构模拟用户登录及用户验证的结构。
1.需求描述
- 用户可能通过用户名密码进行系统登录
- 当用户名不存在时提示 “用户不存在”
- 用户未登录时:
- 当用户密码不匹配时提示 “用户名密码不正确”
- 当用户密码为空是提示 “用户密码不能为空”
- 当用户名密码匹配时提示 “用户登录成功”
- 查询用户信息,用户只能查询自己的信息
- 登录系统用户与查询用户的用户名不相同时,提示 “您无权查询此用户信息”
- 登录系统用户与查询用户的用户名不相同时, 显示用户信息
2.设计描述
2.1 用户信息
使用一个字典模拟数据库存放的用户信息,用户信息包含:
字段名 | 格式 | 说明 |
---|---|---|
用户名 | 字符串 | |
密码 | 加密后的字符串 | Md5加密 |
是否已登录 | bool | 0-未登录 1-已登录 |
登录时间 | datetime |
使用文件来存放用户数据字典:
初始化用户,使用一个函数将创建4个用户账号,并将账号存放在字典中返回。
创建一个用户类处理文件读写,用户创建,数据初始化操作
class User:
# staticmethod:user_list = dict()
user_list = {
}
user_file = r".\user1.bin"
def __init__(self):
self.user_list = self.InitUserInfo()
# 写数据到用户数据文件
def OutToFile(self, oUsers=None):
if oUsers == None:
oUsers = self.InitUserInfo()
with open(self.user_file, 'wb') as f:
f.write(json.dumps(oUsers).encode("utf-8"))
f.flush()
f.close()
# 从数据文件读数据
def ReadFromFile(self):
with open(self.user_file, 'rb') as f:
data = f.read()
f.close()
return json.loads(data)
# 创建用户
def BuildUser(self, *args):
'''
args[0]: UserName
args[1]: Password
'''
oUserInfo = {
'UserName': args[0],
'PassWord': hashlib.md5(args[1].encode('utf-8')).hexdigest(),
'IsLogin': 0,
'LastTime': datetime.today().strftime("%Y-%m-%d %H:%I:%S")
}
return oUserInfo
# 初始化用户数据
def InitUserInfo(self):
user_dict = dict()
user_dict["A01"] =self.BuildUser("U01","123")
user_dict["A02"] =self.BuildUser("U02","123")
user_dict["A03"] =self.BuildUser("U03","123")
user_dict["A04"] =self.BuildUser("U04","123")
return user_dict
2.2 验证用户
创建两个闭包函数
一个用来在验证用户信息时,通过装饰器模式来验证用户状态。函数将需要最多两个参数,第一个参数为用户名,第二个参数为密码。如果仅验证用户状态,则只需要传入第一个用户名即可。
一个用来实现用户登出操作,通过装饰器模式来更新用户状态为登出。
- 这里通过使用一个列表参数 *args 来实现不定数量参数。
- 通过hashlib库的md5来加密码密码
- 在只有验证通过时才会执行装饰器对应的函数
# 验证用户状态
# 01 - 用户不存在
# 02 - 用户密码不能为空
# 03 - 用户名密码不正确!
# 00 - 用户登录成功
def ValidUser(func):
def UserStatus(*args):
user_name = pass_word = None
if len(args) >= 1:
user_name = args[0]
if len(args) >= 2:
pass_word = hashlib.md5(args[1]