最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談vue后臺管理系統(tǒng)權限控制思考與實踐

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

前言

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

權限控制需求

因為是單頁面應用,路由交給前端來控制,對于一些需要特定權限才能查看的信息的保護變得尤為重要,如果前端不做好權限校驗,后端也一時疏忽,就可能就會導致數據泄露。

對于權限控制,需求大致為如下:

  1. 對于大模塊的限制,比如需要通過路由跳轉的模塊,這時需要進行路由攔截
  2. 對于小功能的限制,比如一個按鈕,如果沒有特定權限,那么這個按鈕就不顯示

安全層面的思考

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

權限被管理員修改后立即生效

對于這個需求,我的做法是,獲取到權限列表后,將權限信息存儲在 vuex store 中,并且使用getter函數,對于是否可以使用該權限進行判斷,這樣一旦權限數據更新,前端權限限制功能點會自動修改,從而做到權限的實時性,大致實現如下:

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

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

這樣一來,數據存儲在內存中,那么權限信息就無法輕易的被修改,同時對于權限的判斷也非常簡單,只需要在特定功能點傳入功能點的權限id就能判斷是否可以使用這個權限了。

但是將數據存儲在了內存中也會遇到一個問題,頁面刷新怎么辦?接下來就是講解這種情況。

刷新頁面也可以進行權限判斷

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

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

所以我的做法是,建立一個中間頁,如果權限校驗不通過,那么跳轉至中間頁,中間頁進行權限的請求,請求到權限后,再判斷是否可以跳轉,這樣的話,刷新頁面體驗就比較好。大致代碼如下:

// vuex actions.js
// 通過返回一個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
// 需要驗證權限的路由
{
  path: 'suppliers',
  component: Suppliers,
  meta: {
    role: 'admin',
    privilegeId: 5
  }
}

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

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

// 權限校驗中間頁代碼示例
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') // 如果沒有任何權限,則跳轉登陸頁面
  })
}

用戶在登陸后也可以跳轉到這個權限中間頁,進行權限判斷后再跳轉到對應模塊。

尾聲

大致的實現過程就是這樣,希望對大家有所幫助,如果有暗坑還請指出。也希望大家多多支持腳本之家。

相關文章

  • vue+element樹組件 實現樹懶加載的過程詳解

    vue+element樹組件 實現樹懶加載的過程詳解

    這篇文章主要介紹了vue+element樹組件 實現樹懶加載的過程,本文通過圖文實例代碼相結合給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Vue extend學習示例講解

    Vue extend學習示例講解

    這篇文章主要介紹了Vue.extend使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-09-09
  • 淺析Vue3中的邏輯復用

    淺析Vue3中的邏輯復用

    這篇文章主要為大家詳細介紹了Vue3中邏輯復用的相關知識,文中的示例代碼簡潔易懂,對我們深入了解Vue3有一定的幫助,需要的小伙伴可以參考下
    2023-12-12
  • vue和element上傳圖片以及進行拖拽圖片排序問題

    vue和element上傳圖片以及進行拖拽圖片排序問題

    這篇文章主要介紹了vue和element上傳圖片以及進行拖拽圖片排序問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue如何使用watch監(jiān)聽指定數據的變化

    vue如何使用watch監(jiān)聽指定數據的變化

    這篇文章主要介紹了vue如何使用watch監(jiān)聽指定數據的變化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • VueJs與ReactJS和AngularJS的異同點

    VueJs與ReactJS和AngularJS的異同點

    這篇文章主要為大家詳細介紹了VueJs與ReactJS和AngularJS的異同點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • vue-cli擴展多模塊打包的示例代碼

    vue-cli擴展多模塊打包的示例代碼

    本篇文章主要介紹了vue-cli擴展多模塊打包的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • VUE實現吸底按鈕

    VUE實現吸底按鈕

    這篇文章主要為大家詳細介紹了VUE實現吸底按鈕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 本地部署element-plus文檔的簡單步驟

    本地部署element-plus文檔的簡單步驟

    由于公司網絡登element-ui官方文檔很慢,想把他載下來離線文檔本地跑,下面這篇文章主要給大家介紹了關于本地部署element-plus文檔的簡單步驟,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • vue+iview tabs context-menu 彈出框修改樣式的方法

    vue+iview tabs context-menu 彈出框修改樣式的方法

    今天遇到一個需求說頁面頂部的菜單右鍵彈出框離得有點遠,需要我們做調整,下面小編給大家分享下vue+iview tabs context-menu 彈出框修改樣式的方法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評論

广饶县| 侯马市| 河津市| 拉孜县| 新民市| 盐亭县| 仙桃市| 黎平县| 浮山县| 德化县| 巴南区| 昭通市| 栾城县| 绥宁县| 娄底市| 山西省| 秭归县| 甘谷县| 竹北市| 阿鲁科尔沁旗| 和平县| 台安县| 贵德县| 新建县| 沙田区| 星座| 商城县| 昭平县| 云安县| 普兰店市| 肥乡县| 麻城市| 泌阳县| 保德县| 东至县| 曲靖市| 西华县| 三台县| 德州市| 惠水县| 龙陵县|