Vue路由許可權控制分析

2021-10-21 17:53:05 字數 3686 閱讀 1821

本人在公司主要負責中後台系統的開發,其中路由和許可權校驗算是非常重要且最為基本的一環。實際開發專案中,關於登入和路由許可權的控制參照了vue-element-admin這個明星專案,並在此基礎上基於業務進行了整合,接下來我會以這個專案為例,仔細地剖析整個路由和許可權校驗的過程,也算是對這個知識點的一些總結。

進入今天主題之前,我們先來梳理下整個專案,src 目錄下的。

對這專案感興趣的同學可以自行,有針對性地學習,除了路由許可權校驗的功能以外,也包含了很多有意思的功能,相信能夠學到不少東西。

路由2.png

import router from './router'

import store from './store'

import  from 'element-ui'

import nprogress from 'nprogress' // progress bar

import 'nprogress/nprogress.css' // progress bar style

import  from '@/utils/auth' // get token from cookie

nprogress.configure() // nprogress configuration

const whitelist = ['/login', '/auth-redirect'] // 白名單配置

router.beforeeach(async(to, from, next) => )

nprogress.done() // hack: 

} else  else  = await store.dispatch('user/getinfo')

// 根據使用者的角色,動態生成路由

const accessroutes = await store.dispatch('permission/generateroutes', roles)

// 動態新增路由 (將基本的路由資訊跟動態路由進行合併)

router.addroutes(accessroutes)

// 繼續訪問

next()

} catch (error) `)

nprogress.done()

} }} } else  else `)

nprogress.done()

} }}) router.aftereach(() => )

注意到,**中的/login?redirect=$, 這裡的 redirect 引數主要是用於,在使用者登入成功後進行跳轉的頁面路徑。具體功能在/views/login/index.vue 檔案下

watch: 

}, immediate: true

}},// methods下的:

handlelogin() )

this.loading = false

}) } else 

})},

我們先來看看路由的定義,在/src/router/index.js 檔案下

export const constantroutes = [ // 用來定義普通的路由配置,不需要訪問許可權的

// 路由配置物件

]export const asyncroutes = [ // 通過路由元資訊meta.roles來設定訪問許可權,一般來說是個陣列

, // ...

}]

動態新增路由時,本質上就是根據使用者的角色資訊在 asyncroutes 路由配置陣列中進行路由篩選,找到相對應的路由,與 constantroutes 合併生成最新的路由。

動態路由生成.png

動態路由生成.png

**入口: permission.js

const accessroutes = await store.dispatch('permission/generateroutes', roles)
permission/generateroutes 方法入口檔案:/strore/modules/permissions.js

import  from '@/router'

const state = 

const mutations = 

} const actions = , roles)  else 

// 將最終的結果存放到vuex中

commit('set_routes', accessedroutes)

// resolve出去

resolve(accessedroutes)

}) }

}

對非同步路由進行篩選,並將最終的結果存放到 vuex 中,並將結果 resolve 出去

export function haspermission(roles, route)  else 

} export function filterasyncroutes(routes, roles) 

if (haspermission(roles, tmp)) 

// 將處理好的路由配置放入到res中

res.push(tmp)

} })

return res

}

最後回到/permission.js 檔案中

const accessroutes = await store.dispatch('permission/generateroutes', roles)

// 這裡的accessroutes就是篩選之後的路由,

// 最後通過route.addroutes將constroutes和accessroutes進行合併,生成最終的訪問路由

router.addroutes(accessroutes)

路由許可權控制基本流程已經分析完,接下來我們也來看看專案裡的按鈕許可權控制的實現,實現也比較簡單。

基本用法

import store from '@/store'

function checkpermission(el, binding)  = binding

// 從store中拿到我們訪問介面後,取到使用者角色資訊

const roles = store.getters && store.getters.roles

if (value && value instanceof array) )

// 沒有許可權則進行刪除,不展示。

// v-permission具體實現可以根據業務場景進行修改

if (!haspermission) 

} } else 

} export default ,

update(el, binding) 

}

呼叫獲取使用者資訊介面,獲取到使用者資訊, 將使用者資訊存放到 vuex 中

判斷使用者角色

將最終的可訪問路由存放到 vuex 中,最後通過 router.addroutes,整合最後的路由配置列表

不存在 token

Vue 路由 角色的許可權控制

首先說明需求目的,一般在未登陸情況下預設跳轉至login頁面,因此需要導航守衛來確保這一需求。例如忘記密碼,註冊,404各類提醒等頁面的跳轉並不需要使用者進行登陸驗證token操作,因此我們設定了路由白名單讓這些路由可以直接渲染。例如角色admin和user需要使用者進行登陸操作,這時我們就需要在路...

Vue 許可權控制的方法 路由驗證

路由元資訊 meta 如果乙個 有不同的角色,比如 管理員 和 普通使用者 要求不同的角色能訪問的頁面是不一樣的 這個時候我們就可以 把所有的頁面都放在路由表裡 只要 在訪問的時候判斷一下角色許可權 如果有許可權就讓訪問,沒有許可權的話就拒絕訪問,跳轉到404頁面 vue router 在構建路由時...

Vue路由許可權

在做後台管理系統的時候,一般都會遇見路由許可權的問題。大家可以先體驗一下最終的例子 authority vue router 例子專案位址 authorityrouter。在例子的登入頁面中,通過選擇不同的使用者型別來模擬不同的使用者賬號登入的情況,通過不同的使用者型別登入後台的時候,可以看到左側的...