proxy 通过拦截 get/set 实现字段级权限控制,结合角色映射、动态策略及 has/ownkeys 等 trap 防绕过,需递归代理嵌套对象并注意性能与类型限制。

Proxy 可以拦截对象的属性读写操作,在 get 和 set 拦截器中判断当前用户权限,从而实现细粒度的属性访问控制。
用 Proxy 拦截 get/set 实现基础权限校验
核心思路是:创建代理对象时,在 get 中检查读取权限,在 set 中检查写入权限。权限规则可基于用户角色、字段白名单或自定义函数。
- 定义一个权限映射表,例如:
{ user: ['name', 'email'], admin: ['name', 'email', 'password', 'role'] } - 在
get拦截器中,先获取当前用户角色,再判断目标 key 是否在其允许读取的字段列表中 - 在
set拦截器中做类似判断;若不通过,直接抛错或静默忽略 - 注意对
has、ownKeys等元操作也做相应限制,防止绕过
支持动态权限与字段级策略
权限不一定是静态的,可以结合上下文动态计算。比如某些字段只在特定条件(如时间、状态)下可读,或需二次确认才能修改。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 把权限判断逻辑封装成函数,接收
target、key、receiver和额外上下文(如currentUser) - 字段可配置策略对象:
{ readable: true, writable: false, condition: () => Date.now() > deadline } - 在拦截器中调用该策略,返回
true才放行,否则拒绝
避免代理被绕过的关键细节
仅靠 get/set 不足以覆盖所有访问路径,需配合其他 trap 防止绕过。
-
has拦截in操作符,防止用'password' in user探测字段存在性 -
ownKeys控制Object.keys()、for...in返回的键列表,隐藏敏感字段 -
getOwnPropertyDescriptor防止通过Object.getOwnPropertyDescriptor()获取属性描述符 - 对
defineProperty和deleteProperty也要做权限校验
实际使用时的注意事项
Proxy 是浅层代理,只代理第一层属性。嵌套对象需递归代理,或结合 Reflect 委托原操作。
- 不要直接返回原始值,而应返回代理后的子对象(尤其在
get中遇到 object 类型时) - 避免无限递归:检查返回值是否已是代理,是则不再包装
- 性能敏感场景慎用,每个属性访问都会经过 JS 引擎拦截,大量字段时开销明显
- Proxy 无法代理非对象类型(如 number、string),也不能代理
undefined或null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










