使用set集合运算实现权限白名单过滤:交集判断宽松策略(任一权限即可),并集+差集验证严格策略(必须全满足),差集反向过滤剔除高危权限;注意字符串格式统一、服务端校验优先及set及时更新。

直接用 Set 的集合运算做权限白名单过滤,核心在于:把「用户实际拥有的权限」和「接口/资源要求的白名单权限」都转为 Set,再通过并集、交集、差集快速判断是否放行。
交集判断——是否至少拥有一个必要权限
适用于「只要满足任一权限即可访问」的宽松策略。比如某个报表页面支持用 view_report 或 export_report 中任意一个权限进入。
- 将用户权限列表转为 Set:
const userPerms = new Set(['view_dashboard', 'view_report']) - 将该接口允许的权限也转为 Set:
const requiredPerms = new Set(['view_report', 'export_report']) - 求交集:
const allowed = [...userPerms].filter(p => requiredPerms.has(p)).length > 0 - 更简洁写法(不生成数组):
let hasAccess = false; for (const p of userPerms) { if (requiredPerms.has(p)) { hasAccess = true; break; } }
并集 + 差集组合——强制权限全覆盖
适用于「必须同时具备所有指定权限」的严格策略。例如导出+发送邮件的操作,需同时有 export_data 和 send_email。
- 用户权限 Set:
const userPerms = new Set(['export_data', 'view_logs', 'send_email']) - 所需权限 Set:
const requiredPerms = new Set(['export_data', 'send_email']) - 计算差集(用户缺哪些):
const missing = new Set([...requiredPerms].filter(p => !userPerms.has(p))) - 若
missing.size === 0,说明全部满足;否则拒绝访问
差集反向过滤——动态剔除高危权限
常用于多租户或沙箱场景:先给用户分配基础权限集,再根据角色/环境从其中剔除特定高危项(如 delete_user、modify_config)。
- 基础权限:
const basePerms = new Set(['read', 'write', 'delete_user', 'modify_config']) - 当前上下文禁止的权限:
const bannedPerms = new Set(['delete_user']) - 安全后权限集:
const safePerms = new Set([...basePerms].filter(p => !bannedPerms.has(p))) - 后续所有鉴权都基于
safePerms进行,而非原始集合
性能与边界注意点
Set 查找是 O(1),比数组 includes 的 O(n) 更高效,尤其在权限数较多时优势明显。但要注意:
- 权限字符串需保持格式统一(建议全小写、下划线分隔),避免
'ViewReport'和'view_report'被当成不同权限 - 服务端做鉴权时,不要依赖前端传来的权限列表,应以服务端查库结果为准,前端 Set 运算仅作辅助渲染或预判
- 权限变更后及时更新 Set 实例,避免引用旧对象导致判断失效










