前端如何做权限管理

2,070 阅读2分钟

前端如何做权限管理

coding.jpg

前言

工作之中,我们肯定做过权限管理相关的项目,现就从前端的角度来说一说前端是如何做权限管理的。 对于前端来说,权限管理就是让用户只可以看到自己拥有权限的页面和组件,本质就是用户自己的权限和页面/组件的权限进行比对。

页面级别的权限

我们可以将页面的权限点写在路由的 meta 里面,然后利用路由守卫或动态路由来进行权限的判断处理。
这里为了演示,用户拥有的权限是写死的,真实项目中应该从接口中获取,然后存在store,再从store中获取。

  • 全局路由守卫

    const routes: Array<RouteRecordRaw> = [
      {
        path: "/",
        name: "Home",
        component: Home,
      },
      {
        path: "/about",
        name: "About",
        component: () =>
          import(/* webpackChunkName: "about" */ "../views/About.vue"),
        meta: { authcode: 'about' }
      },
      {
        path: "/test",
        name: "Test",
        component: () =>
          import(/* webpackChunkName: "test" */ "../views/Test.vue"),
        meta: { authcode: 'test' }
      },
      {
        path: "/401",
        name: "401",
        component: Forbidden,
      },
    ];
    
    router.beforeEach((to, _from, next) => {
      // 这里为了演示,是写死的,真实项目中应该从接口中获取,然后存在store,再从store中获取
      const userAuths = ['test']
      const { authcode } = to.meta
      if (authcode) {
        if (userAuths.includes(authcode + '')) {
          next()
        } else {
          next('401')
        }
      } else {
        next()
      }
    })
    
  • 动态路由

    该方案是将路由分成两部分,一部分需要权限,一部分不需要权限;然后对需要权限的路由进行过滤处理,最后再和不需要权限的路由进行合并,生成最终的路由。

      const defaultRoutes: Array<RouteRecordRaw> = [
        {
          path: "/",
          name: "Home",
          component: Home,
        },
        {
          path: "/401",
          name: "401",
          component: Forbidden,
        },
        {
          path: "/404",
          name: "404",
          component: NotFound,
        },
        {
          path: '/:pathMatch(.*)*',
          redirect: { name: '404'}
    
        },
      ]
      const dynamicRoutes: Array<RouteRecordRaw> = [
        {
          path: "/about",
          name: "About",
          component: () =>
            import(/* webpackChunkName: "about" */ "../views/About.vue"),
          meta: { authcode: 'about' }
        },
        {
          path: "/test",
          name: "Test",
          component: () =>
            import(/* webpackChunkName: "test" */ "../views/Test.vue"),
          meta: { authcode: 'test' }
        }
      ];
      function filterRoute(originRoutes: Array<RouteRecordRaw>) {
        const userAuths = ['test']
        return originRoutes.filter((ele) => userAuths.includes(ele.meta!.authcode as string))
      }
    
      const routes = defaultRoutes.concat(filterRoute(dynamicRoutes))
    

组件级别的权限

很多时候,只做页面级别的权限是远远不够的。经常存在这样的需求,页面所有人都可以查看,但是有的人有权限进行操作,而有的人则没有权限进行操作,此时就要求将权限做到组件级别。
还是同样的原理,用户自己的权限和组件的权限进行比对。 对于vue来说,我们可以利用 v-if 来进行控制组件的显示/隐藏。