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

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

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

毒舌时刻

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

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

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

最近看到一个项目,权限判断散落在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

WebAssembly:重塑Web与原生边界的革命性字节码——深度技术全景解析

WebAssembly:重塑Web与原生边界的革命性字节码——深度技术全景解析

在浏览器中运行高性能游戏、在网页里直接编辑4K视频、将C++科学计算库无缝嵌入React应用……这些曾被视为“不可能”的场景,如今正因 WebAssembly(Wasm) 的崛起而成为现实。作为继HTML、CSS、JavaScript之后的第四大Web核心技术,WebAssembly不仅打破了“Web性能天花板”,更正在模糊Web应用与原生应用的边界,开启全栈开发的新纪元。 本文将从设计哲学、核心机制、编译流程、应用场景到未来演进,为你提供一份全面、深入、实战导向的WebAssembly终极指南。 一、为什么需要 WebAssembly?JavaScript 的性能瓶颈 尽管现代JS引擎(V8、SpiderMonkey)通过JIT编译极大提升了性能,但JavaScript作为动态类型、解释执行的语言,在以下场景仍存在先天不足: * CPU密集型计算(如图像处理、物理仿真、加密解密); * 内存敏感操作(如大型数组、手动内存管理); * 复用现有C/C++/Rust代码库(如FFmpeg、TensorFlow、Unity引擎)

Alpamayo-R1-10B部署教程:/etc/supervisor/conf.d下WebUI端口自定义修改实录

Alpamayo-R1-10B部署教程:/etc/supervisor/conf.d下WebUI端口自定义修改实录 1. 项目概述 Alpamayo-R1-10B是专为自动驾驶研发设计的开源视觉-语言-动作(VLA)模型,具备100亿参数规模。该模型通过整合AlpaSim模拟器与Physical AI AV数据集,构建了完整的自动驾驶研发工具链。其核心价值在于通过类人因果推理机制,显著提升自动驾驶决策的可解释性,特别是在处理长尾场景时展现出优异的适应能力。 2. 环境准备 2.1 硬件要求 * GPU配置:至少需要NVIDIA RTX 4090 D级别显卡(22GB显存) * 内存需求:推荐32GB以上系统内存 * 存储空间:需预留30GB以上可用空间 2.2 软件依赖 # 基础环境检查 nvidia-smi # 确认GPU驱动正常 python --version # 需Python 3.12 supervisord --version # 需Supervisor 4.x 3.

StructBERT中文情感分类WebUI教程:多语言界面切换(中/英)实现

StructBERT中文情感分类WebUI教程:多语言界面切换(中/英)实现 基于百度StructBERT模型的中文情感分类WebUI,支持中英文界面切换,让非技术用户也能轻松进行情感分析 1. 项目概述与环境准备 StructBERT中文情感分类模型是百度基于StructBERT预训练模型微调后的经典模型,专门用于识别中文文本的情感倾向(正面/负面/中性)。这个模型在中文NLP领域有着很好的效果和效率平衡,特别适合实际业务应用。 本项目提供了一个完整的WebUI界面,支持单文本和批量情感分析,并且实现了中英文界面切换功能,让不同语言习惯的用户都能方便使用。 环境要求: * Python 3.8+ * PyTorch 1.8+ * Gradio 3.0+ * 至少4GB内存 快速安装: # 创建conda环境 conda create -n sentiment python=3.8 conda activate sentiment # 安装核心依赖 pip install torch gradio flask

浏览器 Web Bluetooth API使用方法

浏览器 Web Bluetooth API使用方法

浏览器 Web Bluetooth API 完整指南 一、简介 什么是 Web Bluetooth API? Web Bluetooth API 让网页应用可以与蓝牙设备通信。通过这个 API,你可以: * 👂 扫描并连接蓝牙设备 * 📤 发送命令到设备 * 📥 接收数据从设备返回 * ⚙️ 控制设备的各种操作 适用场景 医疗设备、手环、手表、传感器、遥控器、音箱、灯等 ↓ 所有支持蓝牙的设备都可以通过这个 API 与网页应用通信 浏览器支持 浏览器支持最低版本Chrome/Edge✅56+ / 79+Firefox⚠️ 需启用98+Safari❌- 二、核心概念(5 分钟快速理解) 2.1 蓝牙通信的三层结构 物理设备(