在原型链查找中嵌入权限控制,通过getter拦截、角色原型继承、树形权限回溯及proxy封装四种方式实现动态授权检查。

在原型链查找中加入权限控制,不是给原型链“加锁”,而是把权限逻辑嵌入到属性访问的路径判断里——让每次查找都变成一次授权检查。
用访问器(getter)拦截查找过程
在原型上用 Object.defineProperty 定义 getter,而不是普通属性。当访问 user.canDelete 时,实际触发的是 getter 函数,里面可以做角色校验、白名单比对或调用策略函数:
- 检查
this._role或this.permissions是否包含当前操作所需权限 - 允许返回真实值、
undefined、抛错,或返回兜底值(如false) - 避免在 getter 里直接读写同名属性,防止无限递归;可用 WeakMap 存真实值
让原型链本身承载权限结构
把角色建模为原型对象,形成自然继承链:比如 Admin.prototype → Editor.prototype → Role.prototype。权限方法(如 canExport())挂载在对应层级上:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 子角色只声明自己新增或覆盖的权限,其余自动沿链继承
- 实例调用时,引擎照常走原型链查找,但每层的实现已内置判断逻辑
- 某个 Admin 实例可临时关闭某权限:
user.canDelete = false,它会优先于原型上的true
配合运行时委托做树形权限回溯
不依赖扁平权限列表,而是把权限节点组织成父子树。查找 user.hasPermission(5) 时,不是查数组,而是启动委托式回溯:
- 先查节点 5 是否被显式授权
- 未命中则查其父节点(
parent_id),再查父的父……直到根节点或找到授权 - 这个过程模拟原型链向上查找,但数据来源是权限树而非 JavaScript 原型
用 Proxy 封装原型链访问入口
不直接暴露原始对象,而是用 Proxy 包一层,所有属性访问(get)、枚举(ownKeys)、甚至方法调用(apply)都经过统一权限闸口:
-
get(target, prop)中判断prop是否属于敏感字段或受限操作 - 结合当前用户上下文(如
currentUser.role)动态放行或拦截 - 保持原型链完整:内部仍用
Reflect.get()调用原逻辑,只是加了一道门










