前端实现权限管理的详细方案(动态路由、接口鉴权、UI 控制 ) ...

打印 上一主题 下一主题

主题 1610|帖子 1610|积分 4830

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在前端配合后端 RBAC(基于脚色的访问控制) 实现权限管理,需要结合 动态路由接口鉴权UI 控制 等技术。
    一、RBAC 权限模型

  1. 核心概念

  

  • 用户(User):系统的使用者(如张三、李四)。
  • 脚色(Role):权限的集合(如管理员、普通用户)。
  • 权限(Permission):具体操纵的最小单位(如 user:add、order:delete)。
  • 脚色-权限映射:脚色与权限的关联关系(如管理员拥有 user:add 和 user:delete)。
  2. 后端接口计划

  

  • 用户登录:返回用户的脚色和权限列表。
  • 获取脚色权限:根据脚色 ID 获取权限列表。
  • 鉴权接口:校验用户是否有权限实行某个操纵。
  二、动态路由的核心头脑

  

  • 静态路由:在项目初始化时定义所有路由。
  • 动态路由:在运行时根据用户权限或其他条件动态生成路由。
  1,动态路由的实现流程

  

  • 用户登录后,获取用户的权限信息。
  • 根据权限信息,筛选出用户有权限访问的路由。
  • 使用 router.addRoute(Vue Router 4)或 router.addRoutes(Vue Router 3)动态添加路由。
  • 在路由跳转时,通过路由守卫校验用户权限。
  2,动态路由的优势

  

  • 机动性:根据用户权限动态生成路由,适应差异脚色的需求。
  • 安全性:通过路由守卫和动态路由,确保用户只能访问有权限的页面。
  • 可维护性:将权限控制和路由管理分离,便于扩展和维护。
  3, 总结

  

  • 动态路由 是实现权限控制的核心技术之一。
  • 通过动态生成路由和路由守卫校验,可以实现机动的权限控制。
  • 动态路由的实现步调包罗:定义路由、获取权限、筛选路由、动态添加路由、校验权限。
  三、前端权限管理实现

     

  • 关键原则:前端权限控制只是辅助,所有敏感操纵必须由后端严酷鉴权
  • 实现步调

    • 用户修改本地权限数据后,可以绕过前端路由跳转,进入本不该访问的页面。
    • 但该页面初始化时,会自动调用后端接口(如获取列表数据)。
    • 后端对每个接口进行权限校验,发现无权限时返回 403 错误码。
    • 前端拦截 403 错误,强制跳转到无权限提示页或登录页。

    注意:以下是一个完整的动态路由实现示例,基于 Vue Router 4 和 Vuex。
  1,定义所有路由

  在项目中定义所有大概的路由,包罗需要权限控制的动态路由和公共路由
  1. // router.js
  2. import { createRouter, createWebHistory } from 'vue-router';
  3. // 公共路由(无需权限)
  4. const publicRoutes = [
  5.   {
  6.     path: '/login',
  7.     component: () => import('@/views/Login.vue'),
  8.     meta: { isPublic: true }, // 标记为公共路由
  9.   },
  10.   {
  11.     path: '/403',
  12.     component: () => import('@/views/403.vue'),
  13.     meta: { isPublic: true }, // 标记为公共路由
  14.   },
  15. ];
  16. // 动态路由(需要权限)
  17. const dynamicRoutes = [
  18.   {
  19.     path: '/dashboard',
  20.     component: () => import('@/views/Dashboard.vue'),
  21.     meta: { permission: 'dashboard_view' }, // 需要权限
  22.   },
  23.   {
  24.     path: '/profile',
  25.     component: () => import('@/views/Profile.vue'),
  26.     meta: { permission: 'profile_view' }, // 需要权限
  27.   },
  28.   {
  29.     path: '/admin',
  30.     component: () => import('@/views/Admin.vue'),
  31.     meta: { permission: 'admin_access' }, // 需要权限
  32.   },
  33. ];
  34. const router = createRouter({
  35.   history: createWebHistory(),
  36.   routes: publicRoutes, // 初始化时只添加公共路由
  37. });
  38. export { router, dynamicRoutes };
复制代码
2,用户登录后获取权限

  用户登录后,从后端获取权限信息,并存储在 Vuex 中。
  1. // user.js
  2. import { createStore } from 'vuex';
  3. const user = createStore({
  4.   state: {
  5.     user: null,
  6.     permissions: [], // 用户权限列表
  7.   },
  8.   mutations: {
  9.     setUser(state, user) {
  10.       state.user = user;
  11.     },
  12.     setPermissions(state, permissions) {
  13.       state.permissions = permissions;
  14.     },
  15.   },
  16.   actions: {
  17.     async login({ commit }, { username, password }) {
  18.       const userInfo = await api.login(username, password);
  19.       const permissions = await api.getPermissions(userInfo.role);
  20.       commit('setUser', userInfo);
  21.       commit('setPermissions', permissions);
  22.     },
  23.   },
  24. });
  25. export default user;
复制代码
3,动态生成路由

  根据用户权限动态生成路由表,并添加到路由实例中。
  1. // permission.js
  2. import { router, dynamicRoutes } from './router';
  3. import store from './store';
  4. // 检查用户是否有权限
  5. function hasPermission(permission, permissions) {
  6.   return permissions.includes(permission);
  7. }
  8. // 筛选出用户有权限访问的路由
  9. function filterRoutes(routes, permissions) {
  10.   return routes.filter(route => {
  11.     if (route.meta?.isPublic) {
  12.       return true; // 公共路由,无需权限
  13.     }
  14.     if (route.meta?.permission) {
  15.       return hasPermission(route.meta.permission, permissions); // 校验权限
  16.     }
  17.     return true; // 默认允许访问
  18.   });
  19. }
  20. // 动态添加路由
  21. export function setupDynamicRoutes() {
  22.   const permissions = store.state.permissions;
  23.   const accessRoutes = filterRoutes(dynamicRoutes, permissions);
  24.   accessRoutes.forEach(route => router.addRoute(route));
  25. }
复制代码
4,路由守卫校验权限

  在路由跳转时,校验用户是否有权限访问目标路由。
  1. // permission.js
  2. router.beforeEach((to, from, next) => {
  3.   const permissions = store.state.permissions;
  4.   if (to.meta?.isPublic) {
  5.     next(); // 公共路由,直接放行
  6.   } else if (to.meta?.permission) {
  7.     if (hasPermission(to.meta.permission, permissions)) {
  8.       next(); // 有权限,放行
  9.     } else {
  10.       next('/403'); // 无权限,跳转到 403 页面
  11.     }
  12.   } else {
  13.     next(); // 默认放行
  14.   }
  15. });
复制代码
5,登录后设置动态路由

  在用户登录成功后,调用 setupDynamicRoutes 设置动态路由。
  1. // Login.vue
  2. <template>
  3.   <button @click="handleLogin">登录</button>
  4. </template>
  5. <script>
  6. import { setupDynamicRoutes } from '@/permission';
  7. export default {
  8.   methods: {
  9.     async handleLogin() {
  10.       await this.$store.dispatch('login', { username: 'admin', password: '123456' });
  11.       setupDynamicRoutes(); // 设置动态路由
  12.       this.$router.push('/dashboard'); // 跳转到首页
  13.     },
  14.   },
  15. };
  16. </script>
复制代码
6,动态渲染菜单

  根据用户权限动态生成侧边栏菜单。
  1. <template>
  2.   <div>
  3.     <ul>
  4.       <li v-for="route in accessRoutes" :key="route.path">
  5.         <router-link :to="route.path">{{ route.meta.title }}</router-link>
  6.       </li>
  7.     </ul>
  8.   </div>
  9. </template>
  10. <script>
  11. export default {
  12.   computed: {
  13.     accessRoutes() {
  14.       return filterRoutes(routes, this.$store.state.permissions);
  15.     },
  16.   },
  17. };
  18. </script>
复制代码
或者这样实现。permissions是计算属性,从vuex中取出来的。
  1. </a-menu>
  2.     <a-menu-item
  3.        key="serverResourceManager"
  4.        v-if="permissions.includes('服务器资源管理')"
  5.      >
  6.          <router-link :to="{ name: 'serverResourceManager' }">服务器资源管理</router-link>
  7.      </a-menu-item>
  8.      <a-menu-item
  9.          key="resourceRequestList"
  10.          v-if="permissions.includes('资源申请列表')"
  11.       >
  12.           <router-link :to="{ name: 'resourceRequestList' }">资源申请列表</router-link>
  13.       </a-menu-item>
  14. </a-menu>
复制代码
四、实用场景

  

  • 企业管理后台:差异脚色(管理员、员工)访问差异功能模块。
  • CMS 系统:编辑、考核、发布等权限分离。
  • 多租户 SaaS 系统:差异租户自定义脚色和权限。
  五、总结

  

  • 核心流程:用户登录 → 获取权限 → 动态生成路由 → 控制 UI 元素。
  • 安全原则:前端控制用户体验,后端兜底校验。
  • 优化方向:减少哀求次数、按需加载权限、Token 短期有用。
  通过 RBAC 模型,可以实现机动的权限管理,实用于复杂的企业级应用。现实开发中需结合具体业务场景调解方案。
     项目中,尤其是管理后台必不可少的一个环节就是权限计划。通常一个系统下的差异用户会对应差异的脚色,差异脚色会对应差异的构造。在进入到管理里后台的时间会去哀求对应的权限接口,这个接口里有和后台约定好的权限标识内容,如果权限管理不是很复杂,可以将当前用户的所有权限标识一次性返回,前端进行一个持久化存储,之后根据规则处置惩罚即可。如果是个极为复杂的权限管理,甚至存在差异操纵导致同一用户对应后续流程权限变化的环境,这里就建议用户首次登录管理后台时,获取的是最高一层权限,即可以看到的页面权限,之后在用户每次做了差异操纵,切换页面的时间,根据约定好的规则,在页面路由切换的时间去哀求下一个页面对应的权限(可以精确到每个交互动作),这样能更加精确的管理权限。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表