• 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. })

    三.简单效果哈

     

     

  • 相关阅读:
    杠杆炒股中洗盘是什么?
    java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
    《Python魔法大冒险》009 魔法之语:字符串的奥秘
    SpringCloud-Nacos集群搭建
    [量化投资-学习笔记001]Python+TDengine从零开始搭建量化分析平台-数据存储
    python+django+vue高校奖学金评定管理系统
    c++ web框架实现之静态反射实现
    LeetCode 43. 字符串相乘
    计算机网络 - 网络层 选择填空判断复习题
    Java高级应用——泛型
  • 原文地址:https://blog.csdn.net/qq_26018335/article/details/126874325