前言
曾經(jīng)在工作上對(duì) vue 路由權(quán)限管理這方面有過研究,這幾天又看到了幾篇相關(guān)的文章,再加上昨天電面中又再一次提及到,就索性整理了一下自己的一些看法,希望對(duì)大家有幫助。
實(shí)現(xiàn)
大體上實(shí)現(xiàn)的思路很簡(jiǎn)單,先上圖:
無非是將路由配置按用戶類型分割為 用戶路由 和 基本路由,不同的用戶類型可能存在不同的 用戶路由,具體依賴實(shí)際業(yè)務(wù)。
用戶路由: 當(dāng)前用戶所特有的路由
基本路由:所有用戶均可以訪問的路由
實(shí)現(xiàn)控制的方式分兩種:
通過vue-router addRoutes 方法注入路由實(shí)現(xiàn)控制
通過vue-router beforeEach 鉤子限制路由跳轉(zhuǎn)
addRoutes 方式:
通過請(qǐng)求服務(wù)端獲取當(dāng)前用戶路由配置,編碼為 vue-router 所支持的基本格式(具體如何編碼取決于前后端協(xié)商好的數(shù)據(jù)格式),通過調(diào)用 this.$router.addRoutes 方法將編碼好的用戶路由注入到現(xiàn)有的 vue-router 實(shí)例中去,以實(shí)現(xiàn)用戶路由。
beforeEach 方式
通過請(qǐng)求服務(wù)端獲取當(dāng)前用戶路由配置,通過注冊(cè) router.beforeEach 鉤子對(duì)路由的每次跳轉(zhuǎn)進(jìn)行管理,每次跳轉(zhuǎn)都進(jìn)行檢查,如果目標(biāo)路由不存再于 基本路由 和 當(dāng)前用戶的 用戶路由 中,取消跳轉(zhuǎn),轉(zhuǎn)為跳轉(zhuǎn)錯(cuò)誤頁。
以上兩種方式均需要在 vue-router 中配置錯(cuò)誤頁,以保證用戶感知權(quán)限不足。
兩種方式的原理其實(shí)都是一樣的,只不過 addRoutes 方式 通過注入路由配置告訴 vue-router :“當(dāng)前我們就只有這些路由,其它路由地址我們一概不認(rèn)”,而 beforeEach 則更多的是依賴我們手動(dòng)去幫 vue-router 辨別什么頁面可以去,什么頁面不可以去。說白了也就是 自動(dòng) 與 手動(dòng) 的差別。說到這,估計(jì)大家都會(huì)覺得既然是 自動(dòng) 的,那肯定是 addRoutes 最方便快捷了,還能簡(jiǎn)化業(yè)務(wù)代碼,筆者一開始也是這么認(rèn)為的,但是!很多人都忽略了一點(diǎn):
addRoutes 方法僅僅是幫你注入新的路由,并沒有幫你剔除其它路由!
設(shè)想存在這么一種情況:用戶在自己電腦上登錄了管理員賬號(hào),這個(gè)時(shí)候會(huì)向路由中注入管理員的路由,然后再退出登錄,保持頁面不刷新,改用普通用戶賬號(hào)進(jìn)行登錄,這個(gè)時(shí)候又會(huì)向路由中注入普通用戶的路由,那么,在路由中將存在兩種用戶類型的路由,即使用戶不感知,通過改變 url,普通用戶也可以訪問管理員的頁面!
對(duì)于這個(gè)問題,也有一個(gè)解決辦法:
通過新建一個(gè)全新的 Router,然后將新的 Router.matcher 賦給當(dāng)前頁面的管理 Router,以達(dá)到更新路由配置的目的。
筆者做了一個(gè)小demo,大家可以去體驗(yàn)一下。
關(guān)于上述問題,在vue-router 的 github issues 下有過討論,分別是:
Add option to Reset/Delete Routes #1436
Feature request: replace routes dynamically #1234
上面是我整理給大家的,希望今后會(huì)對(duì)大家有幫助。
相關(guān)文章:
layui表格checkbox選擇全選樣式及功能的實(shí)例
layui select動(dòng)態(tài)添加option的實(shí)例
Bootstrap實(shí)現(xiàn)可折疊分組側(cè)邊導(dǎo)航菜單
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com