国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前端權(quán)限控制方案

layman / 3340人閱讀

摘要:體系下的實(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傳遞給組件

1. 組件級別權(quán)限控制

根據(jù)WrappedComponent.displayName判斷組件是否有權(quán)限

class Component{
  // ...
}
Component.displayName = "ComponentA";

const Authed_Component_1 = Auth({
  placeholder: 

無權(quán)限的占位節(jié)點(diǎn)

})(Component)
2. 組件內(nèi)部權(quán)限控制(權(quán)限屬性模式)
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

相關(guān)文章

  • 如何在微服務(wù)架構(gòu)中對資源(前端頁面+后端接口)進(jìn)行權(quán)限控制

    如何對資源(前端頁面+后端接口)進(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)...

    Nosee 評論0 收藏0
  • 前端真的能做到徹底權(quá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è)老生常談的問題,但還是想整理下,有誤的地方望大...

    luck 評論0 收藏0
  • 權(quán)限設(shè)計(jì)的雜談

    摘要:權(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)目中的一些探索過程。我們主要想解決一下問題。 什么...

    yck 評論0 收藏0
  • 20180308_vue-router前端權(quán)限控制問題

    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)限如下: ...

    阿羅 評論0 收藏0
  • 前端插拔式 SPA 應(yīng)用架構(gòu)實(shí)現(xià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è)級...

    Cciradih 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<