前端界面權(quán)限控制-React/Vue實現(xiàn)

前端界面權(quán)限控制-React/Vue實現(xiàn)

前言

在所有管理系統(tǒng)中疏哗,都會包含權(quán)限模塊糙臼,來進行用戶的權(quán)限分配和控制庐镐,從而達到操作和數(shù)據(jù)隔離。

權(quán)限管理主要以后臺權(quán)限控制為主变逃,加上前臺界面顯示來進行不同級別的權(quán)限控制管理必逆。

通常在前端的權(quán)限控制設(shè)計中,按照不同細粒度進行劃分為三類:

  • 頁面級別
  • 模塊級別
  • 按鈕級別

在應(yīng)用React/Vue的前端框架界面中揽乱,這三類基本都是通過組件來進行權(quán)限控制名眉,所以本文主要針對組件的擴展來實現(xiàn)。

實現(xiàn)

以前端界面的用戶模塊權(quán)限控制為例凰棉,通過不同權(quán)限來顯示可操作的組件损拢,達到操作控制效果。

前端要加入權(quán)限控制的話撒犀,要確保新模塊對原系統(tǒng)的侵入性很小福压,盡量在不改動原系統(tǒng)框架的基礎(chǔ)上進行擴展。

首先在用戶登錄后或舞,后臺會返回相應(yīng)的權(quán)限集合荆姆,然后進行界面控制。

權(quán)限組集合:

// 權(quán)限集合
let auths = [
  {id: 100, auth: 'admin_user', name: '用戶模塊'},
  {id: 101, auth: 'admin_user_get', name: '查看用戶'},
  {id: 102, auth: 'admin_user_add', name: '添加用戶'},
  {id: 103, auth: 'admin_user_del', name: '刪除用戶'},
  {id: 104, auth: 'admin_user_edit', name: '編輯用戶'},
]

接下來將從react和vue兩個框架分別實現(xiàn)權(quán)限控制

React實現(xiàn)

在react框架中映凳,采用的是React高階組件來實現(xiàn)權(quán)限控制胆筒。在不改動原有組件的情況下,對現(xiàn)有組件進行權(quán)限屬性擴展魏宽。

通過高階組件包裝現(xiàn)有組件腐泻,進行權(quán)限組件驗權(quán)决乎,如果組件無需權(quán)限控制或權(quán)限匹配,則默認不做處理派桩,直接顯示原組件构诚。如果組件權(quán)限校驗失敗,則顯示空內(nèi)容铆惑。[注意:使用高階組件包裝范嘱,如果原組件用到靜態(tài)方法和ref屬性,需要特殊處理员魏,請參考React高階組件說明]

驗權(quán)實現(xiàn):

// 組件驗權(quán)
function checkAuth(auth) {
  // 用戶權(quán)限表
  const rules = auths;
  for (let i = 0; i < rules.length; i++) {
      const item = rules[i]
      // 無需權(quán)限控制或者權(quán)限匹配則通過
      if(!auth || (auth == item.auth)){
          return true
      }
  }
  return false
}

// 高階組件包裝原組件
function warpAuth(WrappedComponent) {
  let New = class extends React.Component {
    constructor(props) {
      super(props)
    }

    render () {
      if (checkAuth(this.props.auth)) {
        return <WrappedComponent {...this.props} />
      } else {
        return null
      }
    }
  }
  // 丑蛤!如果原組件有靜態(tài)方法,則需要進行拷貝處理
  // https://github.com/mridgway/hoist-non-react-statics
  // hoistNonReactStatic(New, WrappedComponent);
  return New
}

實例應(yīng)用:

let Button = wrapAuth(Button)
class Page extends React.Component {
  constructor(props) {
    super(props)
  }

  render () {
    return (
      <div>
        <Button auth="admin_user_add">添加用戶</Button>
        <Button auth="admin_user_del">刪除用戶</Button>
        <Button auth="admin_user_edit">編輯用戶</Button>
      </div>
    )
  }
}

Vue實現(xiàn)

在vue框架中撕阎,采用的是Vue自定義指令來實現(xiàn)權(quán)限控制受裹。在不改動原有組件的情況下,對現(xiàn)有組件統(tǒng)一進行權(quán)限指令擴展虏束。

通過自定義權(quán)限指令棉饶,進行權(quán)限組件驗權(quán),如果組件無需權(quán)限控制或權(quán)限匹配镇匀,則默認不做處理照藻,直接顯示原組件。如果組件權(quán)限校驗失敗汗侵,則移除該組件幸缕。[注意:添加自定義指令,全部組件包括第三方組件庫都會生效]

驗權(quán)實現(xiàn):

// 需要在入口處添加自定義權(quán)限指令v-auth晰韵,顯示可操作組件
Vue.directive('auth', {
    bind: function (el, binding, vnode) {
        // 用戶權(quán)限表
        const rules = auths
        for (let i = 0; i < rules.length; i++) {
            const item = rules[i]
            if(!binding.value || (binding.value == item.auth)){
                // 權(quán)限允許則顯示組件
                return true
            }
        }
        // 移除組件
        el.parentNode.removeChild(el)
    }
})

實例應(yīng)用:

<template>
  <div>
    <Button v-auth="admin_user_add">添加用戶</Button>
    <Button v-auth="admin_user_del">刪除用戶</Button>
    <Button v-auth="admin_user_edit">編輯用戶</Button>
  </div>
</template>
<script>
  import {Button} from 'iview'
  export default {
    components: {
      Button
    },
    data () {
    }
  }
</script>

總結(jié)

可能有人會說发乔,如果只通過簡單檢測是否有權(quán)限,那萬一有人進行非法權(quán)限注入雪猪,前端界面就會顯示本該無權(quán)限的操作組件列疗。針對這個問題的疑慮,我想說任何前端的權(quán)限控制浪蹂、加密、設(shè)防等技術(shù)都存在缺陷告材,因為暴漏在外的程序被破解的風險很高坤次,還是那句話,后臺對前臺發(fā)出的請求都不應(yīng)該直接信任斥赋,任何包含權(quán)限的操作都需要在后臺進行攔截和過濾缰猴,識別用戶的權(quán)限再進行處理。
好了疤剑,關(guān)于前端的權(quán)限控制就寫到這滑绒,有任何疑問和錯誤隨時留言闷堡,感謝支持

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疑故,隨后出現(xiàn)的幾起案子杠览,更是在濱河造成了極大的恐慌,老刑警劉巖纵势,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踱阿,死亡現(xiàn)場離奇詭異,居然都是意外死亡钦铁,警方通過查閱死者的電腦和手機软舌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牛曹,“玉大人佛点,你說我怎么就攤上這事±璞龋” “怎么了超营?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長焰手。 經(jīng)常有香客問我糟描,道長,這世上最難降的妖魔是什么书妻? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任船响,我火速辦了婚禮,結(jié)果婚禮上躲履,老公的妹妹穿的比我還像新娘见间。我一直安慰自己,他們只是感情好工猜,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布米诉。 她就那樣靜靜地躺著,像睡著了一般篷帅。 火紅的嫁衣襯著肌膚如雪史侣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天魏身,我揣著相機與錄音惊橱,去河邊找鬼。 笑死箭昵,一個胖子當著我的面吹牛税朴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼正林,長吁一口氣:“原來是場噩夢啊……” “哼泡一!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起觅廓,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鼻忠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哪亿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粥烁,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年蝇棉,在試婚紗的時候發(fā)現(xiàn)自己被綠了讨阻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡篡殷,死狀恐怖钝吮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情板辽,我是刑警寧澤奇瘦,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站劲弦,受9級特大地震影響耳标,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邑跪,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一次坡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧画畅,春花似錦砸琅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淫僻,卻和暖如春诱篷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雳灵。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工兴蒸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人细办。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親笑撞。 傳聞我的和親對象是個殘疾皇子岛啸,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容