如何在Vue中實(shí)現(xiàn)權(quán)限控制

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何在Vue中實(shí)現(xiàn)權(quán)限控制,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

為吉隆等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及吉隆網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站制作、吉隆網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

路由元信息(meta)

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

這個(gè)時(shí)候我們就可以 把所有的頁(yè)面都放在路由表里 ,只要 在訪問的時(shí)候判斷一下角色權(quán)限 。如果有權(quán)限就讓訪問,沒有權(quá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 屬性里,將能訪問該路由的角色添加到 roles 里。用戶每次登陸后,將用戶的角色返回。然后在訪問頁(yè)面時(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')
  },
]

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

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

只要一切換頁(yè)面,就需要看有沒有這個(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)頁(yè)時(shí),進(jìn)入需要登錄的頁(yè)面都會(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頁(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>

vue是什么

Vue是一套用于構(gòu)建用戶界面的漸進(jìn)式JavaScript框架,Vue與其它大型框架的區(qū)別是,使用Vue可以自底向上逐層應(yīng)用,其核心庫(kù)只關(guān)注視圖層,方便與第三方庫(kù)和項(xiàng)目整合,且使用Vue可以采用單文件組件和Vue生態(tài)系統(tǒng)支持的庫(kù)開發(fā)復(fù)雜的單頁(yè)應(yīng)用。

上述就是小編為大家分享的如何在Vue中實(shí)現(xiàn)權(quán)限控制了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:如何在Vue中實(shí)現(xiàn)權(quán)限控制
URL標(biāo)題:http://bm7419.com/article28/pscocp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、App開發(fā)、微信公眾號(hào)、建站公司、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)