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