前端权限控制设计:别再写死权限判断了

前端权限控制设计:别再写死权限判断了

前端权限控制设计:别再写死权限判断了

毒舌时刻

这代码写得跟网红滤镜似的——仅供参考。

各位前端同行,咱们今天聊聊前端权限控制。别告诉我你还在每个页面写死权限判断,那感觉就像在每个房间都装一把不同的锁——管理起来要命。

为什么你需要权限控制设计

最近看到一个项目,权限判断散落在100个文件里,改一个权限规则要改100处,我差点当场去世。我就想问:你是在做权限控制还是在做权限混乱?

反面教材

// 反面教材:分散的权限判断 // 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) const permissionDirective = { mounted(el, binding) { const { value } = binding; const user = store.getters.user; if (!hasPermission(user, value)) { el.remove(); } } }; // 使用 <template> <button v-permission="'user:edit'">编辑用户</button> <button v-permission="'user:delete'">删除用户</button> </template> 

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); 

最后想说的

权限控制不是小事,是应用安全的基石。别再写死权限判断了——设计好你的权限系统,应用会更安全、更易维护。

权限控制就像门禁系统,分散管理像每个门一把钥匙,集中管理像一卡通。别做钥匙管理员,做一卡通管理员。

Read more

OpenClaw启动后,web控制面板无法登录,返回信息:Not Found

OpenClaw启动后,web控制面板无法登录,返回信息:Not Found

在1.19这台服务器安装了OpenClaw,不管用浏览器,还是直接使用curl,都是返回信息:Not Found 但是1.12这台服务器就没有问题... curl http://localhost:18789 Not Found 查看绑定情况 openclaw config get gateway.bind 🦞 OpenClaw 2026.3.2 (85377a2) — I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet. loopback 绑定到lan 打开网络连通 openclaw config

【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典

【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典

半桔:个人主页  🔥 个人专栏: 《前端扫盲》《手撕面试算法》《C++从入门到入土》 🔖阻止了我的脚步的,并不是我所看见的东西,而是我所无法看见的那些东西。 《海上钢琴师》 文章目录 * 前言 * 一. CSS是什么 * 1.1 概念 * 1.2 基本语法 * 二. CSS如何引入HTML * 2.1 内部样式表 * 2.2 行内选择器 * 2.3 外部引入 * 三. CSS选择器 * 3.1 基础选择器 * 3.1.1 标签选择器 * 3.1.2 类选择器 * 3.1.3 id选择器 * 3.

前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

前端与 Spring Boot 后端无感 Token 刷新 - 从原理到全栈实践

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战 🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解 🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用 🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例 ✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧 💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程 🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整 👍《Spring Security》专栏中我们将逐步深入Spring Security的各个

Flutter 三方库 xpath_selector 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、精准的 HTML/XML 数据抓取与 Web 结构解析引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 xpath_selector 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、精准的 HTML/XML 数据抓取与 Web 结构解析引擎 在鸿蒙(OpenHarmony)系统的网络爬虫、自动化测试审计、或者是从复杂的第三方 Web 公告(HTML)中提取关键数据(如新闻标题、资产负债表)时,如何摆脱凌乱的正向正则(Regex),转而使用业界标准的 XPath 语法进行语义化选取?xpath_selector 为开发者提供了一套工业级的、基于 Dart 的 HTML/XML 结构化查询方案。本文将深入实战其在鸿蒙端数据治理中的应用。 前言 什么是 XPath Selector?