亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談vue后臺(tái)管理系統(tǒng)權(quán)限控制思考與實(shí)踐

 更新時(shí)間:2018年12月19日 10:56:24   作者:子物  
這篇文章主要介紹了淺談vue后臺(tái)管理系統(tǒng)權(quán)限控制思考與實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

最近在開發(fā)管理系統(tǒng)時(shí)遇到了任何管理系統(tǒng)都會(huì)有的需求---權(quán)限控制,之前也遇到過這種需求,但是架構(gòu)不完善導(dǎo)致的各種問題使得后期維護(hù)非常麻煩,這一次的方案解決了之前的種種問題,現(xiàn)做一次記錄,當(dāng)然這個(gè)架構(gòu)后期可能會(huì)有坑,不過得一步一步的嘗試才能發(fā)現(xiàn)并解決問題。

權(quán)限控制需求

因?yàn)槭菃雾撁鎽?yīng)用,路由交給前端來控制,對(duì)于一些需要特定權(quán)限才能查看的信息的保護(hù)變得尤為重要,如果前端不做好權(quán)限校驗(yàn),后端也一時(shí)疏忽,就可能就會(huì)導(dǎo)致數(shù)據(jù)泄露。

對(duì)于權(quán)限控制,需求大致為如下:

  1. 對(duì)于大模塊的限制,比如需要通過路由跳轉(zhuǎn)的模塊,這時(shí)需要進(jìn)行路由攔截
  2. 對(duì)于小功能的限制,比如一個(gè)按鈕,如果沒有特定權(quán)限,那么這個(gè)按鈕就不顯示

安全層面的思考

之前接手了一個(gè)管理系統(tǒng),前端是將權(quán)限列表存儲(chǔ)在storage中來實(shí)現(xiàn)長久儲(chǔ)存,這種實(shí)現(xiàn)方式是很不可取的,因?yàn)閔acker可以通過手動(dòng)更改存儲(chǔ)的信息來實(shí)現(xiàn)獲取特定權(quán)限,甚至系統(tǒng)都沒有做路由攔截,如果知道模塊的路由,可以直接通過輸入路由信息來直接跳轉(zhuǎn)到特定模塊。對(duì)于一些模塊的權(quán)限,權(quán)限被管理員修改后也無法立即生效,所以對(duì)于這幾種情況做了如下思考與實(shí)踐。

權(quán)限被管理員修改后立即生效

對(duì)于這個(gè)需求,我的做法是,獲取到權(quán)限列表后,將權(quán)限信息存儲(chǔ)在 vuex store 中,并且使用getter函數(shù),對(duì)于是否可以使用該權(quán)限進(jìn)行判斷,這樣一旦權(quán)限數(shù)據(jù)更新,前端權(quán)限限制功能點(diǎn)會(huì)自動(dòng)修改,從而做到權(quán)限的實(shí)時(shí)性,大致實(shí)現(xiàn)如下:

// vuex state.js
export default {
  userPrivileges: {
    admin: [],
    purchaser: []
  }, // 用戶權(quán)限信息
}
// vuex getters.js
export default {
  canIUse: state => (role, id) => state.userPrivileges[role].includes(id)
}

// 頁面具體小功能,通過 mapGetters 引入 canIUse 函數(shù)
<span v-if="canIUse('admin', 9)">{{scope.row.allocation_subtotal}}</span>

這樣一來,數(shù)據(jù)存儲(chǔ)在內(nèi)存中,那么權(quán)限信息就無法輕易的被修改,同時(shí)對(duì)于權(quán)限的判斷也非常簡單,只需要在特定功能點(diǎn)傳入功能點(diǎn)的權(quán)限id就能判斷是否可以使用這個(gè)權(quán)限了。

但是將數(shù)據(jù)存儲(chǔ)在了內(nèi)存中也會(huì)遇到一個(gè)問題,頁面刷新怎么辦?接下來就是講解這種情況。

刷新頁面也可以進(jìn)行權(quán)限判斷

對(duì)于大模塊的權(quán)限攔截,肯定是通過路由鉤子來進(jìn)行攔截的(這種實(shí)現(xiàn)有很多文章講解過,這里不具體講解),但是通過路由鉤子進(jìn)行攔截的前提是,權(quán)限信息得提前存在。

刷新頁面會(huì)存在這種情況,頁面刷新時(shí),先執(zhí)行的路由鉤子,再執(zhí)行的組件生命周期鉤子來請(qǐng)求權(quán)限的列表,此時(shí)權(quán)限信息不存在,那么頁面跳轉(zhuǎn)到登陸頁的話,體驗(yàn)就不夠友好。

所以我的做法是,建立一個(gè)中間頁,如果權(quán)限校驗(yàn)不通過,那么跳轉(zhuǎn)至中間頁,中間頁進(jìn)行權(quán)限的請(qǐng)求,請(qǐng)求到權(quán)限后,再判斷是否可以跳轉(zhuǎn),這樣的話,刷新頁面體驗(yàn)就比較好。大致代碼如下:

// vuex actions.js
// 通過返回一個(gè)promise,使得store更新與后續(xù)代碼變?yōu)椤巴健眻?zhí)行
export default {
  getUserPrivileges({ commit }) {
    return fetch.get({
      url: '/currentstaff'
    }).then(data => {
      commit('SET_USER_PRIVILEGES_INFO', data.data)
      return data.data
    }).catch(e => {

    })
  }
}
// router.js
// 需要驗(yàn)證權(quán)限的路由
{
  path: 'suppliers',
  component: Suppliers,
  meta: {
    role: 'admin',
    privilegeId: 5
  }
}

function isCanUseThisModule(to, from) {
  return to.matched.every(record => {
    // 利用路由meta存儲(chǔ)相應(yīng)權(quán)限信息
    if (record.meta.role) {
      return store.getters.canIUse(record.meta.role, record.meta.privilegeId)
    } else {
      return true // 如果不需要權(quán)限,直接返回true
    }
  })
}

router.beforeEach((to, from, next) => {
  if (isCanUseThisModule(to, from)) {
    next() // 權(quán)限驗(yàn)證通過,跳轉(zhuǎn)下一路由
  } else {
    next({
      path: '/main/privilegeValidator' // 權(quán)限驗(yàn)證不通過時(shí)的中間頁
    })
  }
})

// 權(quán)限校驗(yàn)中間頁代碼示例
created() {
  this.$store.dispatch('getUserPrivileges').then(data => {
    for (let i = 0; i < data.admin_permissions.length; i++) {
      if (this.canIUse('admin', data.admin_permissions[i])) {
        this.$router.push({
          path: this.routerList.find(value => value.privilegeId === data.admin_permissions[i]).linkHref
        })
        return
      }
    }
    this.$router.push('/login') // 如果沒有任何權(quán)限,則跳轉(zhuǎn)登陸頁面
  })
}

用戶在登陸后也可以跳轉(zhuǎn)到這個(gè)權(quán)限中間頁,進(jìn)行權(quán)限判斷后再跳轉(zhuǎn)到對(duì)應(yīng)模塊。

尾聲

大致的實(shí)現(xiàn)過程就是這樣,希望對(duì)大家有所幫助,如果有暗坑還請(qǐng)指出。也希望大家多多支持腳本之家。

相關(guān)文章

  • 教你如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境

    教你如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境

    這篇文章主要介紹了如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境,文中給大家提到了如何讓 Vite 加載 Electron 的內(nèi)置模塊和 Node.js 的內(nèi)置模塊,需要的朋友可以參考下
    2022-11-11
  • Vue新玩具VueUse的具體用法

    Vue新玩具VueUse的具體用法

    VueUse 是一個(gè)基于 Composition API 的實(shí)用函數(shù)集合。本文就詳細(xì)的介紹了VueUse的具體用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-11-11
  • Vue.js輪播圖走馬燈代碼實(shí)例(全)

    Vue.js輪播圖走馬燈代碼實(shí)例(全)

    這篇文章主要介紹了Vue.js輪播圖走馬燈,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • vue 避免變量賦值后雙向綁定的操作

    vue 避免變量賦值后雙向綁定的操作

    這篇文章主要介紹了vue 避免變量賦值后雙向綁定的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue3 setup() 高級(jí)用法示例詳解

    vue3 setup() 高級(jí)用法示例詳解

    從 vue2 升級(jí)到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的選項(xiàng)式API。這篇文章主要介紹了vue3 setup() 高級(jí)用法,需要的朋友可以參考下
    2021-11-11
  • Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)

    Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)

    這篇文章主要介紹了Vue中如何點(diǎn)擊獲取當(dāng)前元素下標(biāo)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue實(shí)現(xiàn)簡單計(jì)算商品價(jià)格

    vue實(shí)現(xiàn)簡單計(jì)算商品價(jià)格

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡單計(jì)算商品價(jià)格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • Vue.js 2.0學(xué)習(xí)教程之從基礎(chǔ)到組件詳解

    Vue.js 2.0學(xué)習(xí)教程之從基礎(chǔ)到組件詳解

    這篇文章主要介紹了Vue.js 2.0從基礎(chǔ)到組件的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue.js具有一定的參考價(jià)值,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-04-04
  • Vue項(xiàng)目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度

    Vue項(xiàng)目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度

    網(wǎng)站頁面的響應(yīng)速度與用戶體驗(yàn)息息相關(guān),直接影響到用戶是否愿意繼續(xù)訪問你的網(wǎng)站,所以這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包、合并及壓縮優(yōu)化網(wǎng)頁響應(yīng)速度的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • 構(gòu)建Vue3桌面應(yīng)用程序的方法

    構(gòu)建Vue3桌面應(yīng)用程序的方法

    在項(xiàng)目中會(huì)用到 Electron , 一種最流行的框架,可使用Javascript構(gòu)建跨平臺(tái)的桌面應(yīng)用程序。在本文中,我們將研究如何通過 Vite 開發(fā) Vue 3 桌面項(xiàng)目,感興趣的可以了解一下
    2021-05-05

最新評(píng)論