登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  前端

如何将系统模块权限与用户可访问模块进行对比并标记权限状态

时间:2026-08-21 01:43:31 332浏览 收藏

本文介绍如何基于系统模块定义和用户实际权限,生成一个带布尔标记(1/0)的权限映射对象,实现模块动作级的细粒度权限比对与结构化输出。

如何将系统模块权限与用户可访问模块进行对比并标记权限状态

本文介绍如何基于系统模块定义和用户实际权限,生成一个带布尔标记(1/0)的权限映射对象,实现模块动作级的细粒度权限比对与结构化输出。

做权限管理时,经常会遇到这样一个场景:需要把系统里完整的功能模块(modules)和当前用户实际拿到的操作权限(user_modules)逐个动作对齐比对,再用结构化的方式明确标出来这个动作到底有没有被授权——1 代表允许,0 代表禁止。需要特别留意的是,user_modules 往往只会保存用户已经拥有权限的那部分子集,某些模块或者某些动作本身就可能缺失,所以这套比对逻辑一定要把空值处理考虑周全,不能一碰到缺项就出问题。

以下是一个简洁、可复用的解决方案,使用原生 Ja vaScript 实现:

const modules = {
"member": {
"actions": ["create", "edit"]
},
"subscription": {
"actions": ["create", "edit", "move_out", "renew", "void"]
}
};

const user_modules = {
"subscription": {
"actions": ["create", "edit"]
}
};

const result = Object.fromEntries(
Object.entries(modules).map(([moduleName, moduleDef]) => [
moduleName,
{
...moduleDef,
actions: Object.fromEntries(
moduleDef.actions.map(action => [
action,
(user_modules[moduleName]?.actions?.includes(action) ?? false) ? 1 : 0
])
)
}
])
);

console.log(result);
// 输出:
// {
// "member": {
// "actions": { "create": 0, "edit": 0 }
// },
// "subscription": {
// "actions": { "create": 1, "edit": 1, "move_out": 0, "renew": 0, "void": 0 }
// }
// }

关键设计说明:

  • 使用 Object.entries() + Object.fromEntries() 实现模块级遍历与重建;
  • 对每个模块的动作数组,通过 map() 转换为 [action, flag] 键值对数组,再转为对象——确保 actions 字段由数组变为键值映射对象(如 "create": 1),符合目标输出格式;
  • 利用可选链 ?. 和空值合并 ?? 安全访问 user_modules[moduleName]?.actions,避免因模块缺失导致运行时错误;
  • 无需预先初始化所有模块的权限,天然兼容 user_modules 中未声明的模块(全部标记为 0)。

⚠️ 注意事项:

  • 原始数据中 actions 是字符串数组,输出中应为对象(非数组),因此不能直接复用原数组结构;若后端要求保持数组形式(如 [{"create": 1}, {"edit": 0}]),需另行调整序列化逻辑;
  • 若需支持嵌套权限(如带参数的 action)、动态角色继承或多层级权限校验,建议封装为通用 diffPermissions(modules, userModules) 工具函数,并增加类型校验(如 TypeScript 接口);
  • 在大型应用中,该逻辑宜置于服务端或权限中间件中执行,避免前端暴露完整模块结构。

此方案兼顾可读性、健壮性与扩展性,适用于 RBAC 权限模型下的前端权限渲染或 API 响应组装场景。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>