下面介紹兩種權(quán)限控制的方法:
路由元信息(meta) 動態(tài)加載菜單和路由(addRoutes)路由元信息(meta)
如果一個網(wǎng)站有不同的角色,比如 管理員 和 普通用戶 ,要求不同的角色能訪問的頁面是不一樣的
這個時候我們就可以 把所有的頁面都放在路由表里 ,只要 在訪問的時候判斷一下角色權(quán)限 。如果有權(quán)限就讓訪問,沒有權(quán)限的話就拒絕訪問,跳轉(zhuǎn)到404頁面
vue-router 在構(gòu)建路由時提供了元信息 meta 配置接口,我們可以在元信息中添加路由對應(yīng)的權(quán)限,然后在路由守衛(wèi)中檢查相關(guān)權(quán)限,控制其路由跳轉(zhuǎn)。
可以在每一個路由的 meta 屬性里,將能訪問該路由的角色添加到 roles 里。用戶每次登陸后,將用戶的角色返回。然后在訪問頁面時,把路由的 meta 屬性和用戶的角色進行對比,如果用戶的角色在路由的 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 //從后臺獲取的用戶角色const role = 'user'//當(dāng)進入一個頁面是會觸發(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: '個人中心', requireAuth: true // 在需要登錄的路由的meta中添加響應(yīng)的權(quán)限標(biāo)識 } }]// 在守衛(wèi)中訪問元信息function gaurd (to, from, next) { // to.matched.some(record => record.meta.requireAuth) // 可在此處}可以在多個路由下面添加這個權(quán)限標(biāo)識,達到控制的目的
只要一切換頁面,就需要看有沒有這個權(quán)限,所以可以在最大的路由下 main.js 中配置
存儲信息
一般的,用戶登錄后會在本地存儲用戶的認證信息,可以用 token 、 cookie 等,這里我們用 token 。
將用戶的 token 保存到 localStorage 里,而用戶信息則存在內(nèi)存 store 中。這樣可以在 vuex 中存儲一個標(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 // 獲取到用戶信息的同時將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) } }) } }}
新聞熱點
疑難解答
圖片精選