如何在kwargs中检索指定键值对 Python鉴权装饰器代码排查
Python鉴权装饰器逻辑修复
问题背景
需要实现ensure_authorized装饰器,被装饰的函数被调用时,只要传入的关键字参数包含role="admin",就正常返回保密内容,否则返回无权限提示。原代码运行不符合预期,判断逻辑存在错误。
原代码的核心问题
- 校验逻辑完全错误:
{'role','admin'}是集合类型,仅存储两个独立的字符串元素,和键值对结构的kwargs字典类型不匹配,二者做相等判断永远不会成立;同时集合无法存储键值映射关系,根本没法校验role对应的参数值是不是admin。 - 返回逻辑混乱:校验通过的分支没有调用被装饰的原函数,校验不通过的分支直接返回了装饰器内部的
wrapper函数对象,运行时既拿不到保密内容,也不会给出无权限提示。
正确实现方案
校验kwargs中的目标键值对不需要复杂操作,直接通过kwargs.get("role") == "admin"即可判断:get方法会在键不存在时返回None,不会触发KeyError,写法简洁稳妥。校验通过时传入所有参数调用原函数,校验不通过时返回无权限提示即可。
修正后的完整可运行代码:
from functools import wraps def ensure_authorized(fn): @wraps(fn) def wrapper(*args, **kwargs): # 校验是否传入role="admin"键值对 if kwargs.get("role") == "admin": # 校验通过,执行原函数 return fn(*args, **kwargs) # 校验不通过返回无权限提示 return "Unauthorized" @ensure_authorized def show_secrets(*args, **kwargs): return "Shh! Don't tell anybody!" # 测试 print(show_secrets(role="admin")) # 输出: Shh! Don't tell anybody! print(show_secrets(role="guest")) # 输出: Unauthorized print(show_secrets()) # 输出: Unauthorized
内容的提问来源于stack exchange,提问作者Thor
相关产品推荐
相关产品推荐

