vue路由權(quán)限校驗(yàn)功能的實(shí)現(xiàn)代碼
引言
做后臺(tái)系統(tǒng)的時(shí)候,難免會(huì)有用戶權(quán)限的判斷。admin可以查看全部菜單,user只能查看部分菜單。
一開始接觸這個(gè)需求的時(shí)候,完全是純前端做的。在配置路由的時(shí)候,加一個(gè)roles的屬性,通過判斷用戶的roles是否與路由的roles屬性相匹配來作為顯示隱藏的依據(jù)
{
path: '/router',
name: 'router',
meta: {
title: '標(biāo)題',
roles: ['admin','user']
},
component: index,
children: [
{
path: 'children',
name: 'children',
meta: {
title: '子標(biāo)題',
roles: ['admin','user']
},
component: child
}
]
}
// 過濾路由 menuList-菜單 roles-用戶角色
const checkMenuList = (menuList, roles) => {
for (let i = 0; i < menuList.length; i++) {
if (!compareEqual(roles, menuList[i].meta.roles) || menuList[i].meta.noRenderTree) {
menuList.splice(i, 1)
i -= 1
} else {
if (menuList[i].children) {
checkMenuList(menuList[i].children, roles)
}
}
}
return menuList
}
這樣做確實(shí)可以實(shí)現(xiàn)給不同用戶展示不同的菜單。但是如果用戶權(quán)限發(fā)生改變,前端就需要發(fā)版。本著萬物皆可靈活配置的原則。
需求
首先我們要了解,我們要做什么。
我們希望我們可以通過用戶權(quán)限配置功能,達(dá)到靈活配置路由權(quán)限,由服務(wù)器端返回需要展示的路由權(quán)限,前端做展示。
思路
- 前端配置好項(xiàng)目全部頁面的路由
- 服務(wù)器端返回該用戶的權(quán)限列表,前端去匹配,最后返回一個(gè)路由列表,作為菜單
- 為了更好的用戶體驗(yàn),當(dāng)用戶輸入異常的路由時(shí),我們要重定向到一個(gè)404頁面,提示用戶該頁面不存在。
- 基于第3點(diǎn),我們?cè)诿看翁D(zhuǎn)的時(shí)候,還需要判斷這個(gè)頁面是否存在,該用戶是否有權(quán)限進(jìn)行跳轉(zhuǎn)
實(shí)現(xiàn)
ok 思路整理完了?,F(xiàn)在就開始來實(shí)現(xiàn)吧!
首先,routers是需要在前端注冊(cè),我們要先配置整個(gè)頁面的routers。
除了系統(tǒng)的菜單之外,我們還需要配置403錯(cuò)誤頁面,還有l(wèi)ogin、首頁這些基本路由。由于系統(tǒng)菜單還需要與服務(wù)器端返回的路由列表進(jìn)行匹配,暫時(shí)不進(jìn)行注冊(cè)
// router.js
// 基本路由
export const defaultRouter = [
{ path: '/', component: index }, // 首頁
{ path: '/login', name: 'login', component: login } // 登錄頁
]
// 項(xiàng)目全部頁面
export const appRouter = [
{
path: '/router1',
name: 'router1',
redirect: '/router1/test1',
component: router1,
meta: { title: '路由1'},
children: [
{ path: 'test1', name: 'test1', component: test1, meta: { title: '測(cè)試1' } },
{ path: 'test2', name: 'test2', component: test1, meta: { title: '測(cè)試2' } }
]
},
]
// 這個(gè)是我們頁面初始化時(shí)候,注冊(cè)的routes
const routers = [
...defaultRouter
]
const RouterConfig = {
routes: routers
}
const router = new VueRouter(RouterConfig)
全部路由都注冊(cè)完了,接下來就要匹配用戶可訪問的路由了,這一步需要和服務(wù)器端一起約定規(guī)則。
// 服務(wù)器端返回的鍵值對(duì): 路由名:是否有權(quán)限
authRouter:{
'test1': false,
'test2': true
}
拿到服務(wù)器端返回的用戶權(quán)限之后,就開始過濾路由
// 過濾路由 appRouterCopy-項(xiàng)目全部頁面 authRouter-權(quán)限列表
const checkMenuList = (appRouterCopy, authRouter) => {
for (let i = 0; i < appRouterCopy.length; i++) {
let {name, children} = appRouterCopy[i]
if (authRouter[name] === false) {
appRouterCopy.splice(i, 1)
i--
} else if (children && children.length) {
checkMenuList(children, authRouter)
}
}
}
得到過濾后的路由之后,使用addRoutes進(jìn)行注冊(cè)。注意404路由配置要在最后加上。
let error404Page = { path: '/*', name: 'error-404', meta:
{
title: '404-頁面不存在'}, component: error404Page
}
router.addRoutes([...appRouterCopy, error404Page])
到此我們就得到了用戶有權(quán)限的頁面了,可以把得到的列表作為系統(tǒng)菜單渲染上去。接下來就要處理一下跳轉(zhuǎn)異常的狀況了。需要用到beforeEach對(duì)每次跳轉(zhuǎn)進(jìn)行攔截判斷
router.beforeEach(((to, from, next) => {
if (isNotLog && to.name !== 'login') {
// 未登錄 跳轉(zhuǎn)到登錄頁
next({ name: 'login' })
} else if (to.name && (to.name === 'login' || to.name.indexOf('error') !== -1)){
// 跳轉(zhuǎn)異常
next()
} else {
// 校驗(yàn)用戶權(quán)限
checkUser(next, to ,router)
}
})
const checkUser = async (next, to ,router) => {
if (isNotUser) {
// 首次登陸系統(tǒng),沒有用戶信息的時(shí)候 需要獲取用戶信息做過濾路由的操作
const authRouter = getAuthRouter() // 獲取用戶權(quán)限
checkMenuList(appRouterCopy, authRouter)
const error404Page = { path: '/*', name: 'error-404', meta: { title: '404-頁面不存在'}, component: error404Page}
router.addRoutes([...appRouterCopy, error404Page])
if (!appRouterCopy.length) {
// 用戶沒有有權(quán)限的路由 可以跳轉(zhuǎn)到404或者登錄頁
next({ ...error404Page, replace: true })
} else {
next({ ...to, replace: true })
}
} else {
next()
}
}
總結(jié)
到此這篇關(guān)于vue路由權(quán)限校驗(yàn)功能的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)vue路由權(quán)限校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Vue 權(quán)限控制的兩種方法(路由驗(yàn)證)
- 關(guān)于Vue的路由權(quán)限管理的示例代碼
- vue 設(shè)置路由的登錄權(quán)限的方法
- vuex根據(jù)不同的用戶權(quán)限展示不同的路由列表功能
- vue路由守衛(wèi),限制前端頁面訪問權(quán)限的例子
- Vue路由守衛(wèi)及頁面登錄權(quán)限控制的設(shè)置方法(兩種)
- vue權(quán)限路由實(shí)現(xiàn)的方法示例總結(jié)
- vue自定義指令和動(dòng)態(tài)路由實(shí)現(xiàn)權(quán)限控制
- vue-router 控制路由權(quán)限的實(shí)現(xiàn)
- vue動(dòng)態(tài)設(shè)置路由權(quán)限的主要思路
相關(guān)文章
JavaScript 動(dòng)態(tài)加載腳本和樣式的方法
這篇文章主要介紹了JavaScript 動(dòng)態(tài)加載腳本和樣式的方法,需要的朋友可以參考下2015-04-04
你所不了解的javascript操作DOM的細(xì)節(jié)知識(shí)點(diǎn)(一)
這篇文章主要介紹了你所不了解的javascript操作DOM的細(xì)節(jié)知識(shí)點(diǎn)的相關(guān)資料,需要的朋友可以參考下2015-06-06
JavaScript實(shí)現(xiàn)的購物車效果可以運(yùn)用在好多地方
JavaScript實(shí)現(xiàn)的購物車效果,當(dāng)然這個(gè)效果可以運(yùn)用在好多地方,比如好友的選擇,人力資源模塊等等,需要的朋友可以參考下2014-05-05
JS實(shí)現(xiàn)基本的網(wǎng)頁計(jì)算器功能示例
這篇文章主要介紹了JS實(shí)現(xiàn)基本的網(wǎng)頁計(jì)算器功能,涉及JavaScript事件響應(yīng)及數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
js中使用replace方法完成某個(gè)字符的轉(zhuǎn)換
這篇文章主要介紹了js中使用replace方法完成某個(gè)字符的轉(zhuǎn)換,比較實(shí)用,需要的朋友可以參考下2014-08-08
JS控制只能輸入數(shù)字并且最多允許小數(shù)點(diǎn)兩位
這篇文章主要介紹了JS控制只能輸入數(shù)字并且最多允許小數(shù)點(diǎn)兩位,本文給大家提到j(luò)s如何限制input輸入框只能輸入數(shù)字問題,需要的朋友可以參考下2019-11-11
詳解Chart.js輕量級(jí)圖表庫的使用經(jīng)驗(yàn)
這篇文章主要介紹了詳解Chart.js輕量級(jí)圖表庫的使用經(jīng)驗(yàn),Chart.js很容易上手,只需要在頁面中引用腳本文件,并創(chuàng)建 <canvas> 節(jié)點(diǎn)即可渲染出圖表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
JavaScript中本地存儲(chǔ)(LocalStorage)和會(huì)話存儲(chǔ)(SessionStorage)的使用
本地存儲(chǔ)和會(huì)話存儲(chǔ)是比較常用的方法,你知道兩者的區(qū)別嗎,本文詳細(xì)的介紹了JavaScript中本地存儲(chǔ)(LocalStorage)和會(huì)話存儲(chǔ)(SessionStorage)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03

