• vue3简单的前端权限路由实现(通过前端鉴权+侧边栏过滤)


    首先是侧边栏根据不同的权限过滤,然后侧边栏能按照不同权限显示了。但是用户在url输入地址仍然能访问,所以需要鉴权

    一.侧边栏过滤思路

    1.通过路由的meta下的auth存储权限数组

    1. const routes = [
    2. {
    3. path: '/',
    4. redirect: isClient ? '/clientApp' : '/screen',
    5. meta: {
    6. title: '',
    7. auth: ['COLLECT_ADMIN', 'SECOND_CHECK', 'COLLECT', 'FIRST_CHECK', 'ADMIN', 'SURVEY_ADMIN'],
    8. icon: '',
    9. env: 'public',
    10. },
    11. },
    12. {
    13. path: '/Login',
    14. name: 'Login',
    15. component: () => import('../views/Login.vue'),
    16. meta: {
    17. title: '登录页',
    18. auth: ['COLLECT_ADMIN', 'SECOND_CHECK', 'COLLECT', 'FIRST_CHECK', 'ADMIN', 'SURVEY_ADMIN'],
    19. icon: '',
    20. env: 'public',
    21. },
    22. },
    23. {
    24. path: '/screen',
    25. name: 'Screen',
    26. component: () => import('../views/Screen'),
    27. meta: {
    28. title: '大屏',
    29. auth: ['COLLECT_ADMIN', 'SECOND_CHECK', 'COLLECT', 'FIRST_CHECK', 'ADMIN', 'SURVEY_ADMIN'],
    30. icon: '',
    31. env: 'web',
    32. },
    33. },
    34. {
    35. path: '/401',
    36. name: '401',
    37. component: () => import('../views/ErrorPage/401.vue'),
    38. meta: {
    39. title: '',
    40. auth: ['COLLECT_ADMIN', 'SECOND_CHECK', 'COLLECT', 'FIRST_CHECK', 'ADMIN', 'SURVEY_ADMIN'],
    41. icon: '',
    42. env: 'public',
    43. },
    44. },
    45. clientAppRouter,
    46. adminRouter,
    47. ]

    2.侧边栏过滤渲染

    1. const createRoutes = async (routes) => {
    2. const { data } = await http.user.getUserInfo()
    3. //获取用户权限数组
    4. const sysRoleIdArr = data.sysRoleIdArr
    5. //routes是路由列表,根据item.meta.auth和sysRoleIdArr求交集进行权限过滤,得到对应用户权限的数组
    6. const res = routes
    7. .map((item) => {
    8. const isPass = _.intersection(item.meta.auth, sysRoleIdArr)
    9. if (isPass.length) {
    10. return item
    11. }
    12. })
    13. .filter((item) => item)
    14. return await res
    15. }
    16. const filterRouteList = ref([])
    17. //过滤后赋值渲染
    18. createRoutes(props.routeList).then((res) => {
    19. filterRouteList.value = res
    20. })
    1. v-for="item of filterRouteList"
    2. v-show="item.meta.icon"
    3. :key="item.name"
    4. :index="item.name"
    5. @click="changeRouter(item)"
    6. >
    7. <SvgIcon :name="item.meta.icon" style="margin-right: 14px; width: 12px; height: 12px" />
    8. <template #title>{{ item.meta.title }}template>

    二.路由鉴权

    1. router.beforeEach(async (to, from, next) => {
    2. const isLogin = localStorage.getItem('AUTH_ACCESS_TOKEN')
    3. if (to.path == '/Login') {
    4. next()
    5. } else {
    6. //先判断是否登录
    7. if (isLogin) {
    8. const { data } = await http.user.getUserInfo()
    9. const sysRoleIdArr = data.sysRoleIdArr
    10. //to表示要跳到的页面进行鉴权
    11. const isPass = _.intersection(to.meta.auth, sysRoleIdArr)
    12. //如果权限匹对成功则显示,否则显示404页面
    13. isPass.length ? next() : next('/401')
    14. } else if (!isLogin) {
    15. next('/Login')
    16. }
    17. }
    18. })

    三.简单效果哈

     

     

  • 相关阅读:
    Pandas 操作数据(三)
    计算机毕业设计django基于python研究生备考互助系统
    JVM原理(一):JVM运行时数据区域的分析
    可视化 | (四)可视化降维
    玩转代码|逆向分析一下4399小游戏绕过实名认证
    Linux创建删除用户,创建删除组,设置目录所有权,设置目录wre权限
    opencv-图像变换:傅里叶变换
    基于SpringBoot开发的停车位管理系统(调用百度地图api)
    【剑指Offer】整数(二)二进制 - 二进制加法 - JavaScript
    cesium 雷达扫描 (线行扩散效果)
  • 原文地址:https://blog.csdn.net/qq_26018335/article/details/126874325