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

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)站有不同的角色,比如 管理員 和 普通用戶 ,要求不同的角色能訪問的頁面是不一樣的

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

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

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

代碼示例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')
  },
]

頁面控制:

//假設(shè)有兩種角色:admin 和 user 
//從后臺(tái)獲取的用戶角色
const role = 'user'
//當(dāng)進(jìn)入一個(gè)頁面是會(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頁面
 }
})

代碼示例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)中訪問元信息
function gaurd (to, from, next) {
 // to.matched.some(record => record.meta.requireAuth)
 // 可在此處
}

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

只要一切換頁面,就需要看有沒有這個(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)
    }
   })
  }
 }
}

寫好路由表和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)用戶刷新或者重新打開網(wǎng)頁時(shí),進(jìn)入需要登錄的頁面都會(huì)嘗試去請(qǐng)求用戶信息,該操作在整個(gè)訪問過程中只進(jìn)行一次,直到刷新或者重新打開,對(duì)于應(yīng)用后期的開發(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頁面這樣的路由放在動(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="/">主頁</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ì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • 詳解Vuejs2.0之異步跨域請(qǐng)求

    詳解Vuejs2.0之異步跨域請(qǐng)求

    這篇文章主要介紹了詳解Vuejs2.0之異步跨域請(qǐng)求,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • Vue中用watch一次監(jiān)聽多個(gè)值變化的示例詳解

    Vue中用watch一次監(jiān)聽多個(gè)值變化的示例詳解

    在Vue中,watch 本身不能監(jiān)聽多個(gè)變量,但我們可以通過返回具有計(jì)算屬性的對(duì)象然后監(jiān)聽該對(duì)象,從而實(shí)現(xiàn)一次性“監(jiān)聽多個(gè)變量”,本文給大家介紹了Vue中用watch一次監(jiān)聽兩個(gè)值變化的示例,需要的朋友可以參考下
    2024-01-01
  • Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片的方法實(shí)現(xiàn)

    Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片的方法實(shí)現(xiàn)

    本文主要介紹了Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Vue基礎(chǔ)知識(shí)快速入門教程

    Vue基礎(chǔ)知識(shí)快速入門教程

    這篇文章主要介紹了Vue基礎(chǔ)知識(shí)快速入門教程,我們可以先學(xué)會(huì)用,使用一段時(shí)間之后,回頭來熟悉一下Vue框架以及它的特點(diǎn),需要的朋友可以參考下
    2023-05-05
  • 如何在vue中使用video.js播放m3u8格式的視頻

    如何在vue中使用video.js播放m3u8格式的視頻

    這篇文章主要介紹了如何在vue中使用video.js 播放m3u8格式的視頻,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下
    2021-02-02
  • 通過cordova將vue項(xiàng)目打包為webapp的方法

    通過cordova將vue項(xiàng)目打包為webapp的方法

    這篇文章主要介紹了通過cordova將vue項(xiàng)目打包為webapp的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • Vue組合式API的特點(diǎn)及使用方法

    Vue組合式API的特點(diǎn)及使用方法

    在Vue.js?3.0中,推出了新的組合式API,使得開發(fā)者能夠更加方便靈活地編寫Vue組件,這也是組合式?API?成為了?Vue?新的開發(fā)范式,與傳統(tǒng)的選項(xiàng)?API?相比,組合式?API?更加靈活、易于維護(hù)的原因,在本文中,我們將詳細(xì)介紹?Vue?組合式API的風(fēng)格及使用
    2023-06-06
  • 基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制

    基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制

    這篇文章主要為大家學(xué)習(xí)介紹了如何基于Vue實(shí)現(xiàn)簡(jiǎn)單的權(quán)限控制,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以了解一下
    2023-07-07
  • vue如何在main.js中配置全局的通用公共組件

    vue如何在main.js中配置全局的通用公共組件

    這篇文章主要介紹了vue如何在main.js中配置全局的通用公共組件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue內(nèi)聯(lián)處理器中訪問方法和訪問事件參數(shù)詳解

    Vue內(nèi)聯(lián)處理器中訪問方法和訪問事件參數(shù)詳解

    在 Vue 3 中,使用組合式 API 時(shí),可以通過內(nèi)聯(lián)事件處理器來直接在模板中編寫事件處理邏輯,內(nèi)聯(lián)事件處理器不僅可以直接執(zhí)行簡(jiǎn)單的操作,還可以調(diào)用組件中的方法,并訪問事件參數(shù),下面將詳細(xì)講解如何在內(nèi)聯(lián)事件處理器中調(diào)用方法以及訪問事件參數(shù),需要的朋友可以參考下
    2024-12-12

最新評(píng)論

郯城县| 方山县| 保亭| 东乌| 湟中县| 精河县| 万盛区| 宜兰县| 双城市| 扶余县| 宝山区| 肃宁县| 腾冲县| 田林县| 当涂县| 曲周县| 澄江县| 大方县| 南陵县| 北辰区| 崇仁县| 苏州市| 儋州市| 奉贤区| 江永县| 类乌齐县| 图片| 桑植县| 镇江市| 治县。| 大理市| 洪洞县| 阜阳市| 观塘区| 富裕县| 瑞安市| 丁青县| 襄垣县| 沁源县| 达尔| 兴海县|