前端权限控制设计:避免硬编码权限判断
为什么需要权限控制设计
权限判断散落在多个文件中会导致维护成本极高。修改一个权限规则可能需要修改多处代码,极易引发混乱。
反面教材
// 反面教材:分散的权限判断
// 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. 权限设计原则
- 集中管理:权限配置集中存放
- 最小权限:只给必要的权限
- 动态获取:从服务端获取权限
- 前端校验:用户体验,后端兜底
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);
总结
权限控制是应用安全的基石。建议设计好你的权限系统,避免硬编码判断,使应用更安全、更易维护。
权限控制就像门禁系统,分散管理像每个门一把钥匙,集中管理像一卡通。建议采用集中管理模式。

