首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >权限管理与Shiro入门(二)

权限管理与Shiro入门(二)

作者头像
用户1289394
发布2023-09-29 10:22:10
发布2023-09-29 10:22:10
2570
举报
文章被收录于专栏:Java学习网Java学习网

1.3 前端代码实现

1.3.1 路由钩子函数

vue路由提供的钩子函数(beforeEach)主要用来在加载之前拦截导航,让它完成跳转或取消。可以在路由钩子函数中进行校验是否对某个路由具有访问权限

代码语言:javascript
复制
router.beforeEach((to, from, next) => {
  NProgress.start() // start progress bar
  if (getToken()) {
    // determine if there has token
    /* has token */
    if (to.path === '/login') {
      next({path: '/'})
      NProgress.done() // if current page is dashboard will not trigger afterEach hook, 
so manually handle it
   } else {
      if (store.getters.roles.length === 0) {
        // 判断当前用户是否已拉取完user_info信息
        store
         .dispatch('GetUserInfo')
         .then(res => {
            // 拉取user_info
            const roles = res.data.data.roles // note: roles must be a array! such as: 
['editor','develop']
            store.dispatch('GenerateRoutes', {roles}).then(() => {
              // 根据roles权限生成可访问的路由表
              router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
              next({...to, replace: true}) // hack方法 确保addRoutes已完成 ,set the 
replace: true so the navigation will not leave a history record
           })
         })
         .catch(() => { 
           store.dispatch('FedLogOut').then(() => {
              Message.error('验证失败, 请重新登录')
              next({path: '/login'})
           })
         })
     } else {
        next()
     }
   }
 } else {
    /* has no token */
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单,直接进入
      next()
   } else {
      next('/login') // 否则全部重定向到登录页
      NProgress.done() // if current page is login will not trigger afterEach hook, so 
manually handle it
   }
 }
})

1.3.2 配置菜单权限

在 \src\module-dashboard\store\permission.js 下进行修改,开启路由配置

代码语言:javascript
复制
  actions: {
    GenerateRoutes({ commit }, data) {
      return new Promise(resolve => {
        const { roles } = data
        //动态构造权限列表
        let accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
        commit('SET_ROUTERS', accessedRouters)
        //commit('SET_ROUTERS', asyncRouterMap) // 调试开启全部路由
        resolve()
     })
   }
 }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-29 07:30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档