使用vue-element-admin整合方案------許可權篇
許可權控制的思路:
在router資料夾中的index.js檔案中有一份路由表,表示每個路由的可訪問許可權.使用者登入後,通過token獲取使用者的role,動態根據使用者的role算出有許可權的路由,通過router.addRoutes動態掛載路由.
每一個後臺的請求不管是 get 還是 post 都會讓前端在請求 header
裡面攜帶使用者的 token,後端會根據該 token 來驗證使用者是否有許可權執行該操作。若沒有許可權則丟擲一個對應的狀態碼,前端檢測到該狀態碼,做出相對應的操作。
具體實現
- 建立vue例項將vue-router掛載,此時vue-router掛載一些登入或者不用許可權的公用的頁面
- 使用者登入後,獲取role,,將role和路由表每個頁面的需要的許可權作比較,生成終端使用者可訪問的路由表
- 呼叫router.addRoutes(store.getters.addRouters)新增使用者可訪問的路由
- 使用vuex管理路由表,根據vuex中可訪問的路由渲染側邊欄元件
先編一個路由表
// router.js
import Vue from 'vue';
import Router from 'vue-router';
import Login from '../views/login/';
const dashboard = resolve => require(['../views/dashboard/index'], resolve);
//使用了vue-routerd的[Lazy Loading Routes
](https://router.vuejs.org/en/advanced/lazy-loading.html)
//所有許可權通用路由表
//如首頁和登入頁和一些不用許可權的公用頁面
export const constantRouterMap = [
{ path: '/login', component: Login },
{
path: '/',
component: Layout,
redirect: '/dashboard',
name: '首頁',
children: [{ path: 'dashboard', component: dashboard }]
},
]
//例項化vue的時候只掛載constantRouter
export default new Router({
routes: constantRouterMap
});
//非同步掛載的路由
//動態需要根據許可權載入的路由表
export const asyncRouterMap = [
{
path: '/permission',
component: Layout,
name: '許可權測試',
meta: { role: ['admin','super_editor'] }, //頁面需要的許可權
children: [
{
path: 'index',
component: Permission,
name: '許可權測試頁',
meta: { role: ['admin','super_editor'] } //頁面需要的許可權
}]
},
{ path: '*', redirect: '/404', hidden: true }
];
通過meta標籤來標示頁面訪問的許可權. 如meta:{role: ['admin','super_editor'] }
注意:404頁面一定要最後載入,如果放在constantRouterMap一同宣告404,後面的頁面都會被攔截到404頁面
main.js
// main.js
router.beforeEach((to, from, next) => {
if (store.getters.token) { // 判斷是否有token
if (to.path === '/login') {
next({ path: '/' });
} else {
if (store.getters.roles.length === 0) { // 判斷當前使用者是否已拉取完user_info資訊
store.dispatch('GetInfo').then(res => { // 拉取info
const roles = res.data.role;
store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可訪問的路由表
router.addRoutes(store.getters.addRouters) // 動態新增可訪問路由表
next({ ...to, replace: true }) // hack方法 確保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
})
}).catch(err => {
console.log(err);
});
} else {
next() //當有使用者許可權的時候,說明所有可訪問路由已生成 如訪問沒許可權的全面會自動進入404頁面
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) { // 在免登入白名單,直接進入
next();
} else {
next('/login'); // 否則全部重定向到登入頁
}
}
});
store/permission.js
// store/permission.js
import { asyncRouterMap, constantRouterMap } from 'src/router';
function hasPermission(roles, route) {
if (route.meta && route.meta.role) {
return roles.some(role => route.meta.role.indexOf(role) >= 0)
} else {
return true
}
}
const permission = {
state: {
routers: constantRouterMap,
addRouters: []
},
mutations: {
SET_ROUTERS: (state, routers) => {
state.addRouters = routers;
state.routers = constantRouterMap.concat(routers);
}
},
actions: {
GenerateRoutes({ commit }, data) {
return new Promise(resolve => {
const { roles } = data;
const accessedRouters = asyncRouterMap.filter(v => {
if (roles.indexOf('admin') >= 0) return true;
if (hasPermission(roles, v)) {
if (v.children && v.children.length > 0) {
v.children = v.children.filter(child => {
if (hasPermission(roles, child)) {
return child
}
return false;
});
return v
} else {
return v
}
}
return false;
});
commit('SET_ROUTERS', accessedRouters);
resolve();
})
}
}
};
export default permission;
通過使用者的許可權和之前router.j裡asyncRouterMap每個頁面所需許可權做匹配,左後返回該使用者能訪問的那些路由.
相關文章
- RBAC許可權---SpringBoot整合SecuritySpring Boot
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架
- SpringBoot與Shiro整合-許可權管理Spring Boot
- Spring Boot:整合Shiro許可權框架Spring Boot框架
- Spring MVC 整合 Shiro 許可權控制SpringMVC
- 許可權之選單許可權
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- springboot 2.x 整合 shiro 許可權框架Spring Boot框架
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- vue許可權問題解決方案Vue
- Linux ACL 許可權之進階篇Linux
- linux使用者許可權Linux
- 許可權系統:一文搞懂功能許可權、資料許可權
- SpringBoot整合SpringSecurityOauth2實現鑑權-動態許可權Spring BootGseOAuth
- jenkins原理篇——成員許可權管理Jenkins
- 十、Abp vNext 基礎篇丨許可權
- Linux使用者與許可權Linux
- mysql使用者許可權管理MySql
- MYSQL學習筆記13: DCL許可權控制(使用者許可權操作)MySql筆記
- SpringBoot2 整合 SpringSecurity 框架,實現使用者許可權安全管理Spring BootGse框架
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- spring-boot-plus整合Shiro+JWT許可權管理SpringbootJWT
- mysql許可權MySql
- 許可權控制
- Linux許可權Linux
- OA辦公軟體篇(二)—許可權管理
- android動態許可權到自定義許可權框架Android框架
- 選單許可權和按鈕許可權設定
- Linux的檔案存取許可權和0644許可權Linux
- Android6.0------許可權申請管理(單個許可權和多個許可權申請)Android
- 【自然框架】許可權的視訊演示(二):許可權到欄位、許可權到記錄框架
- Linux使用者、組、許可權管理Linux
- 使用nginx控制ElasticSearch訪問許可權NginxElasticsearch訪問許可權
- MySQL使用者及許可權管理MySql
- Oracle使用者角色許可權管理Oracle
- linux5-使用者許可權Linux
- MySql查詢使用者許可權MySql
- GoFrame 框架使用 casbin 許可權認證GoFrame框架