有参装饰器,验证身份

有下列用户数据
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()
posted @ 2022-07-12 20:57  Yietong  阅读(32)  评论(0)    收藏  举报