跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

前端权限控制设计:避免硬编码权限判断

前端权限控制设计:避免硬编码权限判断 为什么需要权限控制设计 权限判断散落在多个文件中会导致维护成本极高。修改一个权限规则可能需要修改多处代码,极易引发混乱。 反面教材 权限判断散落各处,会导致维护成本急剧上升。 前端权限控制的正确姿势 基于角色的权限控制(RBAC) **Vue 权限指令示例** 路由权限控制 组件级权限控制 实战技巧:权限控制指南 权限设计原则 **集中管理**:权限配置集中存…

接口猎人发布于 2026/4/6更新于 2026/10/2432K 浏览
前端权限控制设计:避免硬编码权限判断

前端权限控制设计:避免硬编码权限判断

为什么需要权限控制设计

权限判断散落在多个文件中会导致维护成本极高。修改一个权限规则可能需要修改多处代码,极易引发混乱。

反面教材
// 反面教材:分散的权限判断
// Page1.jsx
if (user.role !== 'admin') {
  return <div>无权限</div>;
}

// Page2.jsx
if (!user.permissions.includes('user:view')) {
  return <div>无权限</div>;
}

// Page3.jsx
if (user.role !== 'admin' && user.role !== 'manager') {
  return <div>无权限</div>;
}
// ... 还有 97 个页面

权限判断散落各处,会导致维护成本急剧上升。

前端权限控制的正确姿势

1. 基于角色的权限控制(RBAC)
// 正确姿势:RBAC 权限控制
// permissions/index.js
const permissions = {
  admin: ['*'], // 所有权限
  manager: ['user:view', 'user:edit', 'report:view'],
  user: ['user:view', 'profile:edit']
};

// 权限检查函数
export function hasPermission(user, permission) {
  const userPermissions = permissions[user.role] || [];
  return userPermissions.includes('*') || userPermissions.includes(permission);
}

Vue 权限指令示例

<template>
  <button v-permission="'user:edit'">编辑用户</button>
  <button v-permission="'user:delete'">删除用户</button>
</template>

<script>
const permissionDirective = {
  mounted(el, binding) {
    const { value } = binding;
    const user = store.getters.user;
    if (!hasPermission(user, value)) {
      el.remove();
    }
  }
};
</script>
2. 路由权限控制
// 正确姿势:路由权限控制
// router/index.js
const routes = [
  {
    path: '/admin',
    component: AdminLayout,
    meta: {
      requiresAuth: true,
      roles: ['admin']
    },
    children: [
      {
        path: 'users',
        component: UserManagement,
        meta: {
          permission: 'user:manage'
        }
      }
    ]
  }
];

// 路由守卫
router.beforeEach((to, from, next) => {
  const user = store.getters.user;
  if (to.meta.requiresAuth && !user) {
    next('/login');
    return;
  }
  if (to.meta.roles && !to.meta.roles.includes(user.role)) {
    next('/403');
    return;
  }
  if (to.meta.permission && !hasPermission(user, to.meta.permission)) {
    next('/403');
    return;
  }
  next();
});
3. 组件级权限控制
// 正确姿势:组件级权限控制
// components/Permission.jsx
function Permission({ permission, children, fallback = null }) {
  const user = useUser();
  if (!hasPermission(user, permission)) {
    return fallback;
  }
  return children;
}

// 使用
function UserPage() {
  return (
    <div>
      <h1>用户管理</h1>
      <Permission permission="user:create">
        <button>新建用户</button>
      </Permission>
      <Permission permission="user:delete">
        <button>删除用户</button>
      </Permission>
      <Permission permission="user:export" fallback={<span>无导出权限</span>}>
        <button>导出数据</button>
      </Permission>
    </div>
  );
}

实战技巧:权限控制指南

1. 权限设计原则
  1. 集中管理:权限配置集中存放
  2. 最小权限:只给必要的权限
  3. 动态获取:从服务端获取权限
  4. 前端校验:用户体验,后端兜底
2. 最佳实践
// ✅ 权限常量定义
const PERMISSIONS = {
  USER_VIEW: 'user:view',
  USER_CREATE: 'user:create',
  USER_EDIT: 'user:edit',
  USER_DELETE: 'user:delete'
};

// ✅ 权限组合
const ADMIN_PERMISSIONS = [
  PERMISSIONS.USER_VIEW,
  PERMISSIONS.USER_CREATE,
  PERMISSIONS.USER_EDIT,
  PERMISSIONS.USER_DELETE
];

// ✅ 权限检查
const canEditUser = hasPermission(user, PERMISSIONS.USER_EDIT);

总结

权限控制是应用安全的基石。建议设计好你的权限系统,避免硬编码判断,使应用更安全、更易维护。

权限控制就像门禁系统,分散管理像每个门一把钥匙,集中管理像一卡通。建议采用集中管理模式。

目录

  1. 前端权限控制设计:避免硬编码权限判断
  2. 为什么需要权限控制设计
  3. 反面教材
  4. 前端权限控制的正确姿势
  5. 1. 基于角色的权限控制(RBAC)
  6. 2. 路由权限控制
  7. 3. 组件级权限控制
  8. 实战技巧:权限控制指南
  9. 1. 权限设计原则
  10. 2. 最佳实践
  11. 总结

更多推荐文章

查看全部
  • 选择排序算法原理与实现
  • 位运算实战:两整数之和与只出现一次的数字
  • Python PyQt6 实战:从零构建简易记事本
  • 基于Vivado的RISC-V五级流水线CPU FPGA实现详解
  • Neo4j 知识图谱颜色定制方法与最佳实践
  • FireRedASR-AED-L 嘈杂环境中文语音识别效果对比与原理分析
  • AI 并非前端 UI 的终结者,而是效率加速器
  • OpenClaw 飞书机器人配置与使用指南
  • GitHub Copilot Pro 学生身份认证与配置指南
  • Qwen3-VL 建筑图纸生成:从草图到 CAD 转换实战
  • Python 与 PyCharm 虚拟环境搭建及实战指南
  • 基于 Go 语言的命令行 AI 对话客户端开发实战
  • Spatial Joy 2025 全球 AR&AI 赛事:开发者资源、玩法及避坑攻略
  • 基于 RetinaFace 和 CurricularFace 的教育考勤自动化方案
  • 模拟算法实战:替换问号、提莫攻击、Z 字形变换等 5 题解析
  • Linux 共享内存实现进程间高效数据传输
  • 金仓数据库 KingbaseES:多模融合架构与全场景替代方案
  • 使用 DeepSeek API 构建贪吃蛇游戏实战
  • Java 类加载机制与双亲委派模型深度解析
  • C++ string 类详解:构造、遍历与常用操作

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online