有参装饰器,验证身份
有下列用户数据
user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
并有三个函数
def func1():
pass
def func2():
pass
def func3():
pass
要求:调用上述三个函数的时候需要从user_data中校验用户身份是否正确
并获取当前登录用户拥有的可执行函数功能编号即键access对应的功能编号列表
func1是1、func2是2、func3是3
并且一旦用户登录成功之后后续函数的调用不再校验用户身份
请思考如何获取函数功能编号 如何校验用户身份 如何校验权限
ps:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写
user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
# 8定义全局变量
is_login = {
'is_login': False,
'access_list': []
}
def login_auth(func_id):
def outer(func):
def inner(*args, **kwargs):
# 10 先判断用户是否为登陆状态
if is_login.get('is_login'):
# 11 获取当前用户执行权
access = is_login.get('access_list')
# !2 判断当前函数编号是否在用户权限内
if func_id in access:
res = func(*args, **kwargs)
return res
else:
print('你当前没有编号为%s的函数执行权' % func_id)
else:
# 1.获取用户编号
user_id = input('请输入用户编号>>>').strip()
# 2.判断用户编号是否存在
if user_id in user_data:
# 3.获取用户名和密码
username = input('请输入用户名>>>').strip()
pwd = input('请输入密码>>>').strip()
# 4.比对信息
real_dict = user_data.get(user_id)
if username == real_dict.get('name') and pwd == real_dict.get('pwd'):
# 5 获取权限
access = real_dict.get('access')
# 9.数据正确的情况下,更改全局变量
is_login['is_login'] = True
is_login['access_list'] = access
# 6判断当前用户是否含有当前被装饰函数的执行权限,假设当前被转送给hi函数的红能变好为func_id
if func_id in access:
# 7有权限
res = func(*args, **kwargs)
return res
else:
print('你没有当前功能编号为%s的函数执行权' % func_id)
return inner
return outer
@login_auth('1')
def func1():
print('from func1')
@login_auth('2')
def func2():
print('from func2')
@login_auth('3')
def func3():
print('from func3')
func1()
func2()
func3()

浙公网安备 33010602011771号