vue中對于路由權(quán)限進行判斷的幾種方法(vue-element-admin)

由于element多用來做后端管理界面,所以這里給大家推薦一個用來做后端管理的element框架!(vue-element-admin)

直接進入主題:

1.對路由跳轉(zhuǎn)進行判斷,如果符合權(quán)限就允許,反之就不行

2.對跳轉(zhuǎn)頁面進行邏輯請求判斷,就是頁面數(shù)據(jù)需要一定的權(quán)限才能發(fā)送請求(這樣需要后端人員給你做,個人感覺不太現(xiàn)實,后端估計想干你)

3.根據(jù)權(quán)限,動態(tài)生成對應(yīng)的路由,什么權(quán)限擁有什么路由(vue-element-admin)就是這么做的,動態(tài)生成路由

常用方法一般都是:

?----------- v-if + router.beforeEach() ----------

由于后端管理界面涉及到,對登陸用戶的權(quán)限判斷,可能做的好點的后端管理頁面,要么把相對應(yīng)的跳轉(zhuǎn)事件進行隱藏或判斷,或者把跳轉(zhuǎn)頁面進行隱藏,我之前也是這樣做的,對跳轉(zhuǎn)的路由按鈕進行??v-if??判斷,然后再在router.beforeEach()進行路由判斷,這樣就可以防止部分用戶,根據(jù)請求地址來實現(xiàn)跳轉(zhuǎn)

-------------對跳轉(zhuǎn)的按鈕事件進行權(quán)限判斷-------------

這樣就比第一種方法更直接,對跳轉(zhuǎn)頁面的路由事件,添加一個方法,然后根據(jù)權(quán)限判斷,if和else,滿足就跳轉(zhuǎn),不滿足就return,如果想要提升一下用戶體驗度,就彈出一個消息提示框,說您暫無權(quán)限!這是不是更簡單

這樣的方法,最直觀,最簡單,也最方便!但是呢,用戶體驗度不是很好,而且權(quán)限是寫死的,不具備靈活性,但是并不妨礙這是一種好方法!!

vue-element-admin根據(jù)權(quán)限動態(tài)生成路由的方式

學習了一下vue-element-admin這個后端管理框架后:我就覺得它的這種動態(tài)生成路由的方式很新穎,也很厲害,所以再踩了幾個坑以后,就來記錄一下

構(gòu)建項目上:ts+vuex+cookie

思路:

第一步:

就是在你登陸以后,后端返回token,然后在請求成功的回調(diào)里面,又發(fā)送token去后端去獲取當前用戶的詳細信息,信息中包括了你這名用戶的權(quán)限,是否為管理員身份,還是次級管理員身份,然后將token存入cookie,將請求獲取到的數(shù)據(jù)存入vuex!假設(shè)這個存儲你權(quán)限的字段交roles,是個數(shù)組,類似:[’admin'] or ['Secondary']?

第二步:

這里要說明的是,路由表中會定義兩個路由表,一個為公共路由表,一個為動態(tài)路由表,公共路由表就是不需要權(quán)限也能去訪問,動態(tài)路由表顧名思義就是需要權(quán)限去獲取了!然后根據(jù)獲取到你的權(quán)限之后,會根據(jù)roles中的字段,去遍歷動態(tài)路由表中的對應(yīng)的路由表,然后將符合條件的路由表保存起來


單個路由下面meta里面定義roles字段,和你獲取到的權(quán)限盡量對應(yīng)

第三步:最后將獲取到的符合權(quán)限的路由,合并到固定路由下面,通過router.addRouter(),當然了這里還是要用到router.beforeEach()去做路由判斷,讓權(quán)限更牢靠一點

具體實現(xiàn)方法:貼代碼

獲取用戶信息和權(quán)限

import?{?VuexModule,?Module,?Mutation,?Action,?getModule?}?from?'vuex-module-decorators'

import?{?login,UserInfo?}?from?'../../api/user'

import?{?getCookie,setCookie?}?from?'../../utils/cookies'

import?store?from?'@/store'

export?interface?usermodel{

????username:string,

????password:string,

????token:string

}

@Module({?dynamic:?true,?store,?name:?'user'?})

class?User?extends?VuexModule?implements?usermodel{

????public?username?=?""

????public?password?=?""

????public?token?=?getCookie('token')?||""

????public?roles:string[]?=?[]?

????@Mutation

????private?SET_TOKEN(token:string){

????????this.token?=?token

????}

????@Mutation

????private?SET_ROLES(roles:string[]){

????????this.roles?=?roles

????}

????@Mutation

????private?SET_NAME(name:string[]){

????????this.roles?=?name

????}

????@Action

????public?async?Login(userInfo:{username:string,password:string}){?//登陸獲取token

????????let?{?username,password?}?=?userInfo

????????username?=?username.trim()

????????const?data?=?await?login({username,password})

????????const?{?token?}?=?data?as?any

????????setCookie('token',token)

????????this.SET_TOKEN(token)

????}

????@Action

????public?async?getUserinfo(){?//根據(jù)token去獲取登陸用戶個人信息,判斷個人權(quán)限

????????if(this.token?==?""){

????????????console.log('token不存在或者已過期')

????????}

????????const?{data}?=?await?UserInfo(this.token)

????????if(!data){

????????????throw?Error('未查到此用戶,請重新登陸')

????????}

????????const?{?roles,name?}?=?data

????????if(!roles?||?roles.length<=0){

????????????throw?Error('您不屬于管理員范疇')

????????}

????????this.SET_ROLES(roles)

????????this.SET_NAME(name)

????}

}

export?const?UserModel?=?getModule(User)

根據(jù)權(quán)限篩選對應(yīng)路由

import?{?VuexModule,Module,Action,Mutation,getModule?}?from?'vuex-module-decorators'

import?{?asyncRoutes,constantRoutes?}?from?'@/router'

import?store?from?'@/store'

import?{?RouteConfig?}?from?'vue-router'

export?interface?IpermissionState{

????routes:RouteConfig[],

????dynamicRoutes:?RouteConfig[]

}

const?hasPermission?=?(roles:string[],route:RouteConfig)=>{??//判斷動態(tài)路由中的meta中是否包含你當前用戶的權(quán)限

????if(route.meta?&&?route.meta.roles)?{

????????return?roles.some(role?=>?route.meta.roles.includes(role))

????}else{

????????return?true

????}

}

export?const?filterAsyncRoutes?=?(routes:RouteConfig[],roles:string[]):any=>{??//遞歸查詢出動態(tài)路由中符合當前用戶權(quán)限的路由

????const?res:RouteConfig[]?=?[]

????routes.forEach(route?=>?{

????????const?r?=?{?...route?}

????????if(hasPermission(roles,r)){

????????????if(r.children){

????????????????r.children?=?filterAsyncRoutes(r.children,roles)

????????????}

????????????res.push(r)

????????}

????});

}

@Module({?dynamic:?true,?store,?name:?'permission'?})

class?Permission?extends?VuexModule?implements?IpermissionState{

????public?routes:RouteConfig[]?=?[]

????public?dynamicRoutes:RouteConfig[]?=?[]

????@Mutation

????private?SET_ROLES(routes:RouteConfig[]){??//合并固定路由和動態(tài)路由

????????this.routes?=?constantRoutes.concat(routes)?//合并之后的所有的路由

????????this.dynamicRoutes?=?routes?//獲取到的所有的動態(tài)的路由

????}

????@Action

????public?GenerateRoutes(roles:?string[])?{

????????let?accessedRoutes

????????if(roles.includes('admin')){??//判斷是否為管理員,如果是管理員就不用篩選路由,直接全部給出

????????????accessedRoutes?=?asyncRoutes

????????}else{

????????????accessedRoutes?=?filterAsyncRoutes(asyncRoutes,roles)??//如果是次級管理員,就篩選出符合次級管理員的路由

????????}

????????this.SET_ROLES(accessedRoutes)

????}

}

export?const?PermissionModule?=?getModule(Permission)

將符合權(quán)限的路由添加到固定路由上

import?router?from?'./router'

import?{?Route?}?from?'vue-router'

import?{?UserModel?}?from?'./store/models/user'

import?{?PermissionModule?}?from?'./store/models/permission'

const?whitelist?=?['/login','/auth-redirect']

router.beforeEach(async(to:Route,form:Route,next:any)=>{

????if(UserModel.token){

????????if(to.path?===?'/login'){

????????????next({path:'/'})

????????}else{

????????????if(UserModel.roles.length?===?0){

????????????????try{

????????????????????await?UserModel.getUserinfo()??//調(diào)用獲取用戶信息的方法

????????????????????const?roles?=?UserModel.roles

????????????????????PermissionModule.GenerateRoutes(roles)??//篩選出符合條件的路由

????????????????????router.addRoutes(PermissionModule.dynamicRoutes)?//添加路由

????????????????????next({?...to,?replace:?true?})? //這是會清除瀏覽器中的歷史記錄

????????????????}catch(err){

????????????????????return?console.log(err)

????????????????}

????????????}else{

????????????????next()

????????????}

????????}

????}else{

????????if(whitelist.indexOf(to.path)?!==?-1){

????????????next()

????????}else{

????????????next('/login')

????????}

????}

})

實現(xiàn)方法可能有些繞,有興趣的小伙伴可以去官網(wǎng)下載源碼去看看!多敲個兩遍就知道了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375