vue——利用 router 配置权限管理 及 resetRouter

本文档介绍了在 Vue 项目中如何利用 `router.js` 进行权限配置,详细阐述了如何在 `modules` 文件夹下的路由文件中设置权限,并提供了权限模拟信息的获取方法。此外,还讲解了在需要时如何执行 `resetRouter` 来重置路由。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

router.js

export const constantRoutes = [
  {
    path: '/redirect',
    component: () => import('@/layout'),
    hidden: true,
    children: [
      {
        path: '/redirect/:path*',
        component: resolve => void require(['@/views/redirect/index'], resolve)
      }
    ]
  },
  {
    path: '/',
    redirect: '/home'
  },
  {
    path: '/login',
    name: 'Login',
    component: resolve => void require(['@/views/login/index'], resolve),
    hidden: true
  },
  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true // 判断路由入口是否可见的开关
  },
  {
    path: '/home',
    component: () => import('@/layout'),
    hidden: true,
    children: [
      {
        path: '/home',
        name: 'Home',
        component: resolve => void require(['@/views/homepage/index'], resolve),
        meta: {
          title: '主页',
          keepAlive: false, // 该字段表示该页面需要缓存
          isBack: false // 用于判断上一个页面是哪个
        }
      }
    ]
  }
]
/**
 * 异步挂载 modules 下的路由
 * 动态需要根据权限加载的路由表
 */
const modulesFiles = require.context('./modules', true, /\.js$/)

const routesModules = []
// 自动引入modules目录下的所有模块
modulesFiles.keys().reduce((modules, modulePath) => {
  const value = modulesFiles(modulePath)

  routesModules.push(value.default)
}, {})
export const asyncRoutes = routesModules

modules 文件下的 .js 路由

export default {
  path: '/main',
  component: () => import('@/layout'),
  name: 'Main',
  meta: {
    title: '首页管理',
    icon: 'el-icon-s-help'
  },
  children: [
    {
      path: '/main/user',
      name: 'User',
      component: resolve => void require(['@/views/pages/main/user'], resolve),
      meta: {
        title: '用户信息'
      }
    }
  ]
}

配置权限

// 如果是超级管理员,挂载全部路由全部权限
if (isSuperAdmin) {
  // 重定向404的匹配规则需要在整个完整路由定义的最后面,否则刷新会出错。
  const accessedRoutes = [...asyncRoutes, ...notFoundRoutes]
  accessedRoutes.forEach(item => {
    if (item.children) {
      // 超级管理员赋全部权限
      item.children.forEach(elem => {
        elem.meta = {
          ...elem.meta,
          check: true,
          delete: true,
          add: true,
          edit: true
        }
      })
    }
  })
  commit('SET_ROUTES', accessedRoutes)
  resolve(accessedRoutes)
} else {
  // 如果不是管理员,根据对应身份去获取并设置权限(如下面的 API.GetPermissionData)
  Request.httpRequest({
    method: 'post',
    url: API.GetPermissionData,
    noLoading: true,
    params: {},
    success: (data) => {
      let accessedRoutes = []
      // 匹配前端路由和后台返回的菜单
      accessedRoutes = filterAsyncRoutes(asyncRoutes, data)
      // 重定向404的匹配规则需要在整个完整路由定义的最后面,否则刷新会出错。
      accessedRoutes.push(...notFoundRoutes)
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    },
    error: res => {
      reject(res)
    }
  })
}

配置权限获得的模拟信息

const permissionData = () => {
  result.data = [
    {
      name: 'Table',
      children: [
        {
          name: 'TableDemo',
          auth: {
            add: true,
            check: true,
            delete: true,
            edit: true
          }
        }
      ]
    }
  ]
  return result
}

resetRouter

文档

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

const createRouter = () => new Router({
  mode: 'history',
  routes: []
})

const router = createRouter()

export function resetRouter () {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // the relevant part
}

export default router
### 实现不同角色首页配置的方法 在基于若依框架的Vue前后端分离项目中,实现不同角色的首页配置主要涉及前端和后端两部分的工作。 #### 后端设置权限控制 为了区分不同的用户角色并为其分配特定的首页路径,在后端需要定义好相应的权限规则。由于提到的是Spring Security而非Shiro[^1],这里将以Spring Security为例说明: - **配置Security**:修改`WebSecurityConfig.java`文件中的配置,确保能够识别登录用户的权限信息,并将其传递给前端。 ```java @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") // 设置管理员访问路径 .antMatchers("/user/**").hasAnyRole("USER", "VIP") // 用户和其他特殊身份可访问路径 .anyRequest().authenticated() // 所有请求都需要认证 ... } ``` - **获取当前用户的角色**:当用户成功登陆之后,可以通过编写服务类方法来查询该用户所属的具体角色列表,并作为响应的一部分返回给客户端。 #### 前端处理逻辑 对于前端而言,则是在接收到服务器传来的用户信息(包括但不限于用户名、头像以及最重要的——角色标识)后作出相应调整。 ##### 动态加载菜单与初始页面 借助Vuex进行全局的状态管理,可以在应用启动之初就向API发起请求以获得最新的用户资料;随后依据这些数据决定渲染哪一个视图组件作为默认主页。 ```javascript // store/modules/user.js import { login, getInfo } from '@/api/login' export default { namespaced: true, state: { token: '', name: '', avatar: '', roles: [] }, mutations: { SET_TOKEN(state, token){ state.token = token; }, SET_NAME(state, name){ state.name = name; }, SET_AVATAR(state, avatar){ state.avatar = avatar; }, SET_ROLES(state, roles){ state.roles = roles; // 存储用户拥有的所有角色名 } }, actions: { async Login({ commit }, userInfo){ let result = await login(userInfo); commit('SET_TOKEN', result.data.token); const infoResult = await getInfo(); const { realName, headImgUrl, roleList } = infoResult.data; commit('SET_NAME', realName); commit('SET_AVATAR', headImgUrl || ''); commit('SET_ROLES', roleList.map(item => item.roleCode)); return 'success'; } } }; ``` 接着就是根据上述保存下来的roles属性值判断应该跳转至哪个入口地址了。这一步通常放在路由守卫里完成,即每次切换新页面之前都会先检查一次是否有权进入目标位置。 ```javascript router.beforeEach(async (to, from, next) => { const hasToken = getToken(); if (!hasToken && to.path !== '/login') { next('/login'); } if (hasToken && !store.getters['user/name']) { try { await store.dispatch('user/Login'); // 如果还没有拉取过个人信息则强制执行此操作 const roles = store.getters['user/roles']; let accessedRoutes = filterAsyncRoutes(routes, roles); // 过滤出符合当前用户权限级别的动态路由表项 router.addRoutes(accessedRoutes); // 将计算所得的结果追加进现有导航体系之中 next({...to, replace: true}); // 使用replace模式重新定向回最初的目的地 } catch(error) { removeToken(); // 清除失效凭证 resetRouter(); // 移除已注册过的自定义path映射关系 next(`/login?redirect=${to.fullPath}`); // 提示用户再次输入账号密码验证身份合法性 } } else { next(); } }); ``` 最后,在实际业务场景下可能还需要考虑更多细节问题,比如某些情况下允许跨级别访问资源等特殊情况下的兼容性设计。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值