摘要:權(quán)限路由的實(shí)現(xiàn)方案后端表結(jié)構(gòu)在項(xiàng)目中需要進(jìn)行權(quán)限控制的路由可能是動(dòng)態(tài)變化的。在中,按位操作符將其操作數(shù)當(dāng)作位的比特序列由和組成。表的與比特序號(hào)進(jìn)行關(guān)聯(lián)。
RBAC0(基于角色的訪問(wèn)控制)
Role-Based Access Control:使用角色描述用戶(hù)和權(quán)限(operation+resource)之間的關(guān)系,用戶(hù)和權(quán)限之間無(wú)需直接關(guān)聯(lián)
RBAC 基本模型如圖所示(圖片來(lái)自有贊?rùn)?quán)限系統(tǒng)):
本質(zhì)上,角色就是一組權(quán)限的集合。
VUE權(quán)限路由的實(shí)現(xiàn)方案 0x01后端表結(jié)構(gòu):
在項(xiàng)目中需要進(jìn)行權(quán)限控制的路由可能是動(dòng)態(tài)變化的。也許領(lǐng)導(dǎo)說(shuō)某個(gè)頁(yè)面現(xiàn)在不需要權(quán)限控制,然后過(guò)兩天又需要了。。。
所以在后端維護(hù)一張route表,每個(gè)路由對(duì)應(yīng)一條記錄,id自增,記錄路由的url,是否啟用等。這樣所有需要權(quán)限控制的路由都分配了一個(gè)唯一id。
上面說(shuō)到角色的本質(zhì)是一組權(quán)限的集合,那么可以用int型的二進(jìn)制位來(lái)表示這個(gè)集合,0表示沒(méi)有權(quán)限,1表示有權(quán)限。
在JavaScript中,按位操作符(Bitwise operators)將其操作數(shù)(operands)當(dāng)作32位的比特序列(由0和1組成)。rout表的id與比特序號(hào)進(jìn)行關(guān)聯(lián)。例如50的二進(jìn)制表示為110010,那么表示有id為2,5,6的路由的訪問(wèn)權(quán)限。routes表的里id值表示控制這條路由權(quán)限在二進(jìn)制位中的序號(hào)。
role_route表中的permissions和offset字段描述了一個(gè)角色所擁有的權(quán)限,表示為{(offset1,permissions1),(offset2,permissions2)…(offsetN,permissionsN)}。即用permissions和offset字段關(guān)聯(lián)routes表的id。例如某個(gè)角色在role_route表中有兩條記錄offset為0,permissions為1和offset為1,permissions為2,那么這個(gè)角色完整的二進(jìn)制集合為10(省略30個(gè)0)1,在routes表中所關(guān)聯(lián)的路由id為1和33,即這個(gè)角色擁有路由id為1和33的權(quán)限。
0x02在前端判斷一個(gè)路由是否有權(quán)限:
const permissionUtils = { getSingleRoutePermission (id) { return 1 << (id % 31) }, getOffset (id) { return Math.floor(id / 31) }, } // 假設(shè)當(dāng)前用戶(hù)擁有的角色在role_route表中關(guān)聯(lián)兩條記錄: offset為0,permissions為100和offset為1,permissions為50 const permissions = [100, 50] // offset分別為0,1 permissionUtils.getSingleRoutePermission(routeId) & permissions[permissionUtils.getOffset(routeId)]
給某個(gè)角色增加一個(gè)權(quán)限:
let offset = permissionUtils.getOffset(routeId) permissions.splice(offset, 1, permissions[offset] |= permissionUtils.getSingleRoutePermission(routeId))0x03
這里簡(jiǎn)單描述一下vue-element-admin實(shí)現(xiàn)權(quán)限路由的思路。
/** * asyncRoutes * the routes that need to be dynamically loaded based on user roles */ const asyncRoutes = [ { path: "/permission", component: Layout, name: "Permission", meta: { roles: ["admin", "editor"] } } ] router.addRoutes(asyncRoutes.reduce((permissionRoutes, route) => { user.roles.some(role => route.meta.roles.includes(role)) && permissionRoutes.push(route) return permissionRoutes }, []))
這里可以看到某個(gè)路由的訪問(wèn)權(quán)限是寫(xiě)在路由定義里的,對(duì)于自定義角色和角色較多的情況不太好處理。上面我們使用角色來(lái)存儲(chǔ)路由的訪問(wèn)權(quán)限,實(shí)現(xiàn)將路由的定義和權(quán)限控制分開(kāi)。
0x04使用二進(jìn)制序列來(lái)存儲(chǔ)路由權(quán)限,對(duì)于多角色和自定義角色有很好的支持。
對(duì)于用戶(hù)自定義角色的情況,我們只需要將需要管理的路由id設(shè)置到對(duì)應(yīng)的二進(jìn)制位即可,不影響路由的定義,且可以無(wú)限創(chuàng)建角色。
對(duì)于多角色的情況,只要將用戶(hù)的所有角色做|操作即可,例如 角色1|角色1|···角色N。
在角色數(shù)量和路由數(shù)量大的情況下,使用二進(jìn)制位方式管理權(quán)限應(yīng)該是不錯(cuò)的選擇。
0x05這里并沒(méi)有對(duì)路由和菜單是否分離,路由是否由后端返回以及是否使用全局路由守衛(wèi)等問(wèn)題進(jìn)行討論,使用二進(jìn)制位存儲(chǔ)權(quán)限可以與這幾種方式相結(jié)合,具體選擇看業(yè)務(wù)和個(gè)人喜好。
對(duì)于路由和菜單的管理可以看看這篇文章的總結(jié):vue權(quán)限路由實(shí)現(xiàn)方式總結(jié)
鏈接:
有贊?rùn)?quán)限系統(tǒng)
vue-element-admin
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110279.html
摘要:官方地址設(shè)置單頁(yè)面信息,如果需要單頁(yè)面,可以和形成更優(yōu)的配合單頁(yè)面應(yīng)用在前端正大放光彩。隨著單頁(yè)面應(yīng)用的普及,人們?cè)诟惺芷鋷?lái)的完美的用戶(hù)體驗(yàn),極強(qiáng)的開(kāi)發(fā)效率的同時(shí),也似乎不可避免的要去處理的需求。 vue-meta-info 官方地址: https://github.com/monkeyWang... (設(shè)置vue 單頁(yè)面meta info信息,如果需要單頁(yè)面SEO,可以和 prer...
摘要:官方地址設(shè)置單頁(yè)面信息,如果需要單頁(yè)面,可以和形成更優(yōu)的配合單頁(yè)面應(yīng)用在前端正大放光彩。隨著單頁(yè)面應(yīng)用的普及,人們?cè)诟惺芷鋷?lái)的完美的用戶(hù)體驗(yàn),極強(qiáng)的開(kāi)發(fā)效率的同時(shí),也似乎不可避免的要去處理的需求。 vue-meta-info 官方地址: https://github.com/monkeyWang... (設(shè)置vue 單頁(yè)面meta info信息,如果需要單頁(yè)面SEO,可以和 prer...
摘要:如果一個(gè)頁(yè)面,有角色越權(quán)訪問(wèn),這時(shí)就得做出限制了。我們可以通過(guò)或來(lái)實(shí)現(xiàn),下面用代碼來(lái)展示一下如何用控制登陸驗(yàn)證。 更多文章 頁(yè)面權(quán)限控制 頁(yè)面權(quán)限控制是什么意思呢? 就是一個(gè)網(wǎng)站有不同的角色,比如管理員和普通用戶(hù),要求不同的角色能訪問(wèn)的頁(yè)面是不一樣的。如果一個(gè)頁(yè)面,有角色越權(quán)訪問(wèn),這時(shí)就得做出限制了。 Vue 動(dòng)態(tài)添加路由及生成菜單這是我寫(xiě)過(guò)的一篇文章,通過(guò)動(dòng)態(tài)添加路由和菜單來(lái)做控制,...
摘要:項(xiàng)目背景物業(yè)管理后臺(tái),不同角色擁有不同權(quán)限采用技術(shù)實(shí)現(xiàn)權(quán)限管理需要后端接口支持,這里僅提供前端解決方案。前端代碼可參考如果有更好的想法和建議,歡迎評(píng)論。 項(xiàng)目背景:物業(yè)管理后臺(tái),不同角色擁有不同權(quán)限 采用技術(shù):Vue.js + Vuex + Element UI 實(shí)現(xiàn) RBAC 權(quán)限管理需要后端接口支持,這里僅提供前端解決方案。因代碼篇幅較大,對(duì)代碼進(jìn)行了刪減,文中 ... 即為省略的...
摘要:如果要相應(yīng)狀態(tài)改變,通常最好使用計(jì)算屬性或取而代之。那解決問(wèn)題的思路便是在改變的情況下,保證頁(yè)面的不刷新。后面值的變化,并不會(huì)導(dǎo)致瀏覽器向服務(wù)器發(fā)出請(qǐng)求,瀏覽器不發(fā)出請(qǐng)求,也就不會(huì)刷新頁(yè)面。 1.vue生命周期2.vue 雙向綁定原理3.vue router原理4.vue router動(dòng)態(tài)路由 1.vue 生命周期鉤子 showImg(https://segmentfault.com/...
閱讀 3526·2023-04-25 17:35
閱讀 2599·2021-11-24 09:39
閱讀 2537·2021-10-18 13:32
閱讀 3423·2021-10-11 10:58
閱讀 1641·2021-09-26 09:55
閱讀 6175·2021-09-22 15:47
閱讀 972·2021-08-26 14:15
閱讀 3476·2019-08-30 15:55