摘要:體系下的實(shí)現(xiàn)方式頁面權(quán)限模塊權(quán)限元件權(quán)限三種前端權(quán)限表現(xiàn)形式對應(yīng)不同的管理策略。頁面權(quán)限對于傳統(tǒng)的多頁應(yīng)用,頁面權(quán)限控制不需要前端關(guān)心,后端路由做一層控制。
在做商家后臺管理系統(tǒng)時(shí),作為前端通常會(huì)設(shè)計(jì)到大量的權(quán)限控制問題,按照細(xì)粒度歸歸類大致可以分類以下三類
頁面權(quán)限
模塊權(quán)限-頁面區(qū)塊(組件)是否顯示
元件權(quán)限-組件內(nèi)元素是否顯示
以往的處理方式后端會(huì)將用戶權(quán)限數(shù)據(jù)同步注入到VM模板中或者前端發(fā)送異步請求取到權(quán)限數(shù)據(jù),數(shù)據(jù)消費(fèi)場景一般都散落在代碼的角角落落。
// 偽代碼 render(){ return {window.permission?:null} } render(){ return {this.props.permission?: null} }
用這種方式實(shí)現(xiàn)的代碼,執(zhí)行上沒有問題,也達(dá)到了業(yè)務(wù)的需求。但是隨著代碼量的遞增,代碼變得難以維護(hù),特別是新接手的同學(xué),簡直是一場噩夢。
React體系下的實(shí)現(xiàn)方式頁面權(quán)限、模塊權(quán)限、元件權(quán)限三種前端權(quán)限表現(xiàn)形式對應(yīng)不同的管理策略。
頁面權(quán)限對于傳統(tǒng)的多頁應(yīng)用,頁面權(quán)限控制不需要前端關(guān)心,后端路由做一層控制。在SPA架構(gòu)的前端應(yīng)用中,我們的思路是將所有的前端路由配置在后端,對于不同角色的用戶,后端把路由列表吐給前端注冊。
模塊權(quán)限、元件權(quán)限對于這兩類權(quán)限控制的事就全部需要交給前端處理了,大致思路是將系統(tǒng)中用戶散落的權(quán)限統(tǒng)一配置,通過HOC包裝一下React組件,提供劫持渲染和權(quán)限透傳的能力。
統(tǒng)一管理權(quán)限r(nóng)egisterAuthRules應(yīng)用的所有權(quán)限配置會(huì)被統(tǒng)一配置在一個(gè)閉包中,權(quán)限的值支持后端同步吐出,也支持每次異步獲取(利用Promise實(shí)現(xiàn))
// 偽代碼 export const AUTH_RULES = { "isX1": window.isX1 === "", "isX2": window.isX2 === "", "isX3": () => { return new Promise((resolve, reject) => { resolve(result); // resolve的參數(shù)只能是true或者false }) }, }; registerAuthRules(AUTH_RULES);權(quán)限規(guī)則表達(dá)式
權(quán)限列表中配置的只是顆粒度最細(xì)的單個(gè)權(quán)限。在實(shí)際業(yè)務(wù)需求中,我們常需要根據(jù)權(quán)限格則組合結(jié)果,決定是否顯示。比如ComponentA的顯示條件是isX1 && isX2 或者 isX1 || isX3。
這里需要引入權(quán)限規(guī)則表達(dá)式的概念。How to compute?
第一步:利用詞法分析器解析出表達(dá)式中有多少個(gè)權(quán)限變量。利用esprima可以輕松取到
第二步:計(jì)算每個(gè)變量對應(yīng)的權(quán)限值
第三部:計(jì)算規(guī)則表達(dá)式,因?yàn)闄?quán)限規(guī)則有可能是異步或者的,這里將每個(gè)格則包裝成Promise對象,利用Promise.all做統(tǒng)一返回,在成功的回調(diào)函數(shù)中通過New Function的方式計(jì)算字符串表達(dá)式的結(jié)果
// 計(jì)算表達(dá)式相關(guān)代碼 function getExpressionValue(expression, data) { const codes = []; for (const key in data) { if (data.hasOwnProperty(key)) { const value = typeof data[key] === "string" ? `"${data[key]}"` : data[key]; codes.push(`var ${key} = ${value};`); } } codes.push(`return ${expression};`); return new Function(codes.join(""))(); }如何使用 registerAuthRules
注冊權(quán)限規(guī)則列表,支持同步規(guī)則和異步規(guī)則
參數(shù):
rules {Object} 應(yīng)用權(quán)限規(guī)則MAP
registerComponentRules注冊組件顯示規(guī)則,根據(jù)組件displayName配置組件所需權(quán)限列表
參數(shù):
rules {Object} 組件權(quán)限規(guī)則MAP
調(diào)用查看
export const COMPONENTS_RULES = { ComponentA: "isX1", ComponentB: "isX1 && isX2", }; registerComponentRules(COMPONENTS_RULES)Auth HOC函數(shù)
參數(shù):
options {Object} 組件權(quán)限規(guī)則MAP
options.placeholder {Component} 組件隱藏時(shí)的占位節(jié)點(diǎn);默認(rèn)為noscript
options.initialHide {Boolean} 當(dāng)存在異步權(quán)限規(guī)則時(shí),組件是否先默認(rèn)隱藏;默認(rèn)值為true
options.rules {Object} 配置組件需要權(quán)限規(guī)則集合,作為props屬性$auth傳遞給組件
根據(jù)WrappedComponent.displayName判斷組件是否有權(quán)限
class Component{ // ... } Component.displayName = "ComponentA"; const Authed_Component_1 = Auth({ placeholder:無權(quán)限的占位節(jié)點(diǎn)
})(Component)
class Page{ render(){ const {$auth} = this.props; return ({ $auth.isShowDeleteBtn &&) } } // 權(quán)限校驗(yàn)條件與權(quán)限屬性,組件內(nèi)容沒有校驗(yàn)邏輯 const Authed_Page = Auth({ rules: { "isShowDeleteBtn": "isVip" } })(Page);刪除
}
代碼實(shí)現(xiàn)[hoc-auth]https://github.com/amibug/hoc...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89643.html
如何對資源(前端頁面+后端接口)進(jìn)行權(quán)限控制 在微服務(wù)架構(gòu)中,請求的攔截在gateway中完成,而權(quán)限的查詢是在uaa中完成,在gateway和uaa集成部署的情況下實(shí)現(xiàn)較為簡單,如果兩者分離實(shí)現(xiàn)起來就會(huì)比較麻煩,一種方案是在gateway的資源filter中內(nèi)部調(diào)用uaa的權(quán)限查詢模塊,該方案是可行的,但是存在兩個(gè)弊端: 響應(yīng)延時(shí):每個(gè)資源的請求都會(huì)附帶一次uaa內(nèi)部調(diào)用,加重uaa服務(wù)的負(fù)擔(dān)...
摘要:有一天突然想到一個(gè)問題,端的權(quán)限控制真的能控制權(quán)限嗎僅僅靠前端,能不能做到真正的權(quán)限控制如果需要后臺配合,應(yīng)該如何配合可能這是一個(gè)老生常談的問題,但還是想整理下,有誤的地方望大家指出。 有一天突然想到一個(gè)問題,web端的權(quán)限控制:1.真的能控制權(quán)限嗎?2.僅僅靠前端,能不能做到真正的權(quán)限控制?3.如果需要后臺配合,應(yīng)該如何配合?可能這是一個(gè)老生常談的問題,但還是想整理下,有誤的地方望大...
摘要:權(quán)限設(shè)計(jì)的雜談這篇文章的定位,不是宣傳某個(gè)框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項(xiàng)目中的一些探索過程。而這兩者的取舍則是有設(shè)計(jì)人員決定的。數(shù)據(jù)抽象原則最小特權(quán)劃分從某個(gè)程度上來說決定了控制的對象,而數(shù)據(jù)抽象原則是是決定了操作。 權(quán)限設(shè)計(jì)的雜談 這篇文章的定位,不是宣傳某個(gè)框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項(xiàng)目中的一些探索過程。我們主要想解決一下問題。 什么...
vue-router前端權(quán)限控制問題前提綱要:1.用戶A和用戶B有不同的權(quán)限。 頁面分左側(cè)菜單部分和右側(cè)內(nèi)容部分,右側(cè)內(nèi)容可能有不同路徑的不同內(nèi)容 最簡單例子為點(diǎn)擊左側(cè)用戶管理 右側(cè)顯示用戶列表 點(diǎn)擊某條內(nèi)容詳情 右側(cè)顯示某一用戶的詳細(xì)內(nèi)容 2.用戶A可以訪問路徑權(quán)限如下: a/list a/detail/:id a/list/:id 用戶B可以訪問路徑權(quán)限如下: ...
摘要:插拔式應(yīng)用架構(gòu)方案和傳統(tǒng)前端架構(gòu)相比有以下幾個(gè)優(yōu)勢業(yè)務(wù)模塊分布式開發(fā),代碼倉庫更易管理。 showImg(https://segmentfault.com/img/remote/1460000016053325?w=2250&h=1500); 背景 隨著互聯(lián)網(wǎng)云的興起,一種將多個(gè)不同的服務(wù)集中在一個(gè)大平臺上統(tǒng)一對外開放的概念逐漸為人熟知,越來越多與云相關(guān)或不相關(guān)的中后臺管理系統(tǒng)或企業(yè)級...
閱讀 1683·2021-10-13 09:39
閱讀 3154·2021-10-12 10:11
閱讀 549·2021-09-28 09:36
閱讀 2633·2019-08-30 15:55
閱讀 1384·2019-08-30 13:04
閱讀 621·2019-08-29 17:08
閱讀 1902·2019-08-29 14:14
閱讀 3399·2019-08-28 18:23