欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue 權(quán)限控制的兩種方法(路由驗(yàn)證)

 更新時(shí)間:2019年08月16日 13:45:38   作者:夜夕ilv-1  
這篇文章主要介紹了Vue 權(quán)限控制的兩種方法(路由驗(yàn)證),每種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

下面介紹兩種權(quán)限控制的方法:

  • 路由元信息(meta)
  • 動(dòng)態(tài)加載菜單和路由(addRoutes)

路由元信息(meta)

如果一個(gè)網(wǎng)站有不同的角色,比如 管理員 和 普通用戶 ,要求不同的角色能訪問(wèn)的頁(yè)面是不一樣的

這個(gè)時(shí)候我們就可以 把所有的頁(yè)面都放在路由表里 ,只要 在訪問(wèn)的時(shí)候判斷一下角色權(quán)限 。如果有權(quán)限就讓訪問(wèn),沒(méi)有權(quán)限的話就拒絕訪問(wèn),跳轉(zhuǎn)到404頁(yè)面

vue-router 在構(gòu)建路由時(shí)提供了元信息 meta 配置接口,我們可以在元信息中添加路由對(duì)應(yīng)的權(quán)限,然后在路由守衛(wèi)中檢查相關(guān)權(quán)限,控制其路由跳轉(zhuǎn)。

可以在每一個(gè)路由的 meta 屬性里,將能訪問(wèn)該路由的角色添加到 roles 里。用戶每次登陸后,將用戶的角色返回。然后在訪問(wèn)頁(yè)面時(shí),把路由的 meta 屬性和用戶的角色進(jìn)行對(duì)比,如果用戶的角色在路由的 roles 里,那就是能訪問(wèn),如果不在就拒絕訪問(wèn)。

代碼示例1:

路由信息:

routes: [
  {
    path: '/login',
    name: 'login',
    meta: {
      roles: ['admin', 'user']
    },
    component: () => import('../components/Login.vue')
  },
  {
    path: 'home',
    name: 'home',
    meta: {
      roles: ['admin']
    },
    component: () => import('../views/Home.vue')
  },
]

頁(yè)面控制:

//假設(shè)有兩種角色:admin 和 user 
//從后臺(tái)獲取的用戶角色
const role = 'user'
//當(dāng)進(jìn)入一個(gè)頁(yè)面是會(huì)觸發(fā)導(dǎo)航守衛(wèi) router.beforeEach 事件
router.beforeEach((to,from,next)=>{
 if(to.meta.roles.includes(role)){
 next() //放行
 }esle{
 next({path:"/404"}) //跳到404頁(yè)面
 }
})

代碼示例2

當(dāng)然也可以用下面的一種方法:

// router.js
// 路由表元信息
[
 {
  path: '',
  redirect: '/home'
 },
 {
  path: '/home',
  meta: {
   title: 'Home',
   icon: 'home'
  }
 },
 {
  path: '/userCenter',
  meta: {
   title: '個(gè)人中心',
   requireAuth: true // 在需要登錄的路由的meta中添加響應(yīng)的權(quán)限標(biāo)識(shí)
  }
 }
]

// 在守衛(wèi)中訪問(wèn)元信息
function gaurd (to, from, next) {
 // to.matched.some(record => record.meta.requireAuth)
 // 可在此處
}

可以在多個(gè)路由下面添加這個(gè)權(quán)限標(biāo)識(shí),達(dá)到控制的目的

只要一切換頁(yè)面,就需要看有沒(méi)有這個(gè)權(quán)限,所以可以在最大的路由下 main.js 中配置

存儲(chǔ)信息

一般的,用戶登錄后會(huì)在本地存儲(chǔ)用戶的認(rèn)證信息,可以用 token 、 cookie 等,這里我們用 token 。

將用戶的 token 保存到 localStorage 里,而用戶信息則存在內(nèi)存 store 中。這樣可以在 vuex 中存儲(chǔ)一個(gè)標(biāo)記用戶登錄狀態(tài)的屬性 auth ,方便權(quán)限控制。

代碼示例

// store.js
{
 state: {
  token: window.localStorage.getItem('token'),
  auth: false,
  userInfo: {}
 },
 mutations: {
  setToken (state, token) {
   state.token = token
   window.localStorage.setItem('token', token)
  },
  clearToken (state) {
   state.token = ''
   window.localStorage.setItem('token', '')
  },
  setUserInfo (state, userInfo) {
   state.userInfo = userInfo
   state.auth = true // 獲取到用戶信息的同時(shí)將auth標(biāo)記為true,當(dāng)然也可以直接判斷userInfo
  }
 },
 actions: {
  async getUserInfo (ctx, token) {
   return fetchUserInfo(token).then(response => {
    if (response.code === 200) {
     ctx.commit('setUserInfo', response.data)
    }
    return response
   })
  },
  async login (ctx, account) {
   return login(account).then(response => {
    if (response.code === 200) {
     ctx.commit('setUserInfo', response.data.userInfo)
     ctx.commit('setToken', response.data.token)
    }
   })
  }
 }
}

寫(xiě)好路由表和vuex之后,給所有路由設(shè)置一個(gè)全局守衛(wèi),在進(jìn)入路由之前進(jìn)行權(quán)限檢查,并導(dǎo)航到對(duì)應(yīng)的路由。

// store.js
{
 state: {
  token: window.localStorage.getItem('token'),
  auth: false,
  userInfo: {}
 },
 mutations: {
  setToken (state, token) {
   state.token = token
   window.localStorage.setItem('token', token)
  },
  clearToken (state) {
   state.token = ''
   window.localStorage.setItem('token', '')
  },
  setUserInfo (state, userInfo) {
   state.userInfo = userInfo
   state.auth = true // 獲取到用戶信息的同時(shí)將auth標(biāo)記為true,當(dāng)然也可以直接判斷userInfo
  }
 },
 actions: {
  async getUserInfo (ctx, token) {
   return fetchUserInfo(token).then(response => {
    if (response.code === 200) {
     ctx.commit('setUserInfo', response.data)
    }
    return response
   })
  },
  async login (ctx, account) {
   return login(account).then(response => {
    if (response.code === 200) {
     ctx.commit('setUserInfo', response.data.userInfo)
     ctx.commit('setToken', response.data.token)
    }
   })
  }
 }
}

上述的方法是基于 jwt 認(rèn)證方式,本地不持久化用戶信息,只保存 token ,當(dāng)用戶刷新或者重新打開(kāi)網(wǎng)頁(yè)時(shí),進(jìn)入需要登錄的頁(yè)面都會(huì)嘗試去請(qǐng)求用戶信息,該操作在整個(gè)訪問(wèn)過(guò)程中只進(jìn)行一次,直到刷新或者重新打開(kāi),對(duì)于應(yīng)用后期的開(kāi)發(fā)維護(hù)和擴(kuò)展支持都很好。

動(dòng)態(tài)加載菜單和路由(addRoutes)

有時(shí)候?yàn)榱税踩?,我們需要根?jù)用戶權(quán)限或者是用戶屬性去動(dòng)態(tài)的添加菜單和路由表,可以實(shí)現(xiàn)對(duì)用戶的功能進(jìn)行定制。 vue-router 提供了 addRoutes() 方法,可以動(dòng)態(tài)注冊(cè)路由, 需要注意的是,動(dòng)態(tài)添加路由是在路由表中 push 路由,由于路由是按順序匹配的,因此需要將諸如404頁(yè)面這樣的路由放在動(dòng)態(tài)添加的最后。

代碼示例

// store.js
// 將需要?jiǎng)討B(tài)注冊(cè)的路由提取到vuex中
const dynamicRoutes = [
 {
  path: '/manage',
  name: 'Manage',
  meta: {
   requireAuth: true
  },
  component: () => import('./views/Manage')
 },
 {
  path: '/userCenter',
  name: 'UserCenter',
  meta: {
   requireAuth: true
  },
  component: () => import('./views/UserCenter')
 }
]

在 vuex 中添加 userRoutes 數(shù)組用于存儲(chǔ)用戶的定制菜單。在setUserInfo中根據(jù)后端返回的菜單生成用戶的路由表。

// store.js
setUserInfo (state, userInfo) {
 state.userInfo = userInfo
 state.auth = true // 獲取到用戶信息的同時(shí)將auth標(biāo)記為true,當(dāng)然也可以直接判斷userInfo
 // 生成用戶路由表
 state.userRoutes = dynamicRoutes.filter(route => {
  return userInfo.menus.some(menu => menu.name === route.name)
 })
 router.addRoutes(state.userRoutes) // 注冊(cè)路由
}

修改菜單渲染

// App.vue
<div id="nav">
 <router-link to="/">主頁(yè)</router-link>
 <router-link to="/login">登錄</router-link>
 <template v-for="(menu, index) of $store.state.userInfo.menus">
  <router-link :to="{ name: menu.name }" :key="index">{{menu.title}}</router-link>
 </template>
</div>

總結(jié)

以上所述是小編給大家介紹的Vue 權(quán)限控制的兩種方法(路由驗(yàn)證),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Vue+axios+WebApi+NPOI導(dǎo)出Excel文件實(shí)例方法

    Vue+axios+WebApi+NPOI導(dǎo)出Excel文件實(shí)例方法

    在本篇文章里小編給大家整理關(guān)于Vue+axios+WebApi+NPOI導(dǎo)出Excel文件的知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們參考下。
    2019-06-06
  • Vue中的Ajax?配置代理slot插槽的方法詳解

    Vue中的Ajax?配置代理slot插槽的方法詳解

    這篇文章主要介紹了Vue中的Ajax?配置代理?slot插槽的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Vue 組件(component)教程之實(shí)現(xiàn)精美的日歷方法示例

    Vue 組件(component)教程之實(shí)現(xiàn)精美的日歷方法示例

    組件是我們學(xué)習(xí)vue必須會(huì)的一部分,下面這篇文章主要給大家介紹了關(guān)于Vue 組件(component)教程之實(shí)現(xiàn)精美的日歷的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 解決vue無(wú)法加載文件D:\Program Files\nodejs\node_global\vue.ps1,因?yàn)樵诖讼到y(tǒng)上禁止運(yùn)行腳本

    解決vue無(wú)法加載文件D:\Program Files\nodejs\node_global\vue.ps1,

    這篇文章主要給大家介紹了關(guān)于解決vue無(wú)法加載文件D:\Program Files\nodejs\node_global\vue.ps1,因?yàn)樵诖讼到y(tǒng)上禁止運(yùn)行腳本的相關(guān)資料,這個(gè)報(bào)錯(cuò)是由于在系統(tǒng)上禁止運(yùn)行腳本導(dǎo)致的,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • vue3新擬態(tài)組件庫(kù)開(kāi)發(fā)流程之table組件源碼分析

    vue3新擬態(tài)組件庫(kù)開(kāi)發(fā)流程之table組件源碼分析

    這篇文章主要介紹了vue3新擬態(tài)組件庫(kù)開(kāi)發(fā)流程——table組件源碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證條

    vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證條

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue頁(yè)面內(nèi)公共的多類(lèi)型附件圖片上傳區(qū)域并適用折疊面板(示例代碼)

    Vue頁(yè)面內(nèi)公共的多類(lèi)型附件圖片上傳區(qū)域并適用折疊面板(示例代碼)

    本文中實(shí)現(xiàn)的附件上傳區(qū)域支持超多類(lèi)型附件分類(lèi)型上傳,并且可根據(jù)特定條件具體展示某些類(lèi)型的附件上傳,本文給大家分享Vue頁(yè)面內(nèi)公共的多類(lèi)型附件圖片上傳區(qū)域并適用折疊面板的示例代碼,需要的朋友參考下吧
    2021-12-12
  • 超詳細(xì)的vue組件間通信總結(jié)

    超詳細(xì)的vue組件間通信總結(jié)

    作為一個(gè)vue初學(xué)者不得不了解的就是組件間的數(shù)據(jù)通信(暫且不談vuex),通信方式根據(jù)組件之間的關(guān)系有不同之處,這篇文章主要給大家介紹了關(guān)于vue組件間通信的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Vue實(shí)現(xiàn)購(gòu)物車(chē)詳情頁(yè)面的方法

    Vue實(shí)現(xiàn)購(gòu)物車(chē)詳情頁(yè)面的方法

    這篇文章主要介紹了Vue實(shí)戰(zhàn)之購(gòu)物車(chē)詳情頁(yè)面的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Vue實(shí)戰(zhàn)之掌握自定義指令

    Vue實(shí)戰(zhàn)之掌握自定義指令

    作為使用Vue的開(kāi)發(fā)者,我們對(duì)Vue指令一定不陌生,諸如v-model、v-on、v-for、v-if等,同時(shí)Vue也為開(kāi)發(fā)者提供了自定義指令的api,熟練的使用自定義指令可以極大的提高了我們編寫(xiě)代碼的效率,讓我們可以節(jié)省時(shí)間開(kāi)心的摸魚(yú)
    2022-11-11

最新評(píng)論