基于vue實現(xiàn)網(wǎng)站前臺的權(quán)限管理(前后端分離實踐)
Javascript做為當下的熱門語言,用途很廣泛,從前端到后端處處可見其存在,該技術(shù)如今在我們項目內(nèi)部也大量使用來開發(fā)諸如CMS系統(tǒng)以及其他其他一些數(shù)據(jù)分析系統(tǒng)的前端頁面,為此個人非常感興趣并將其作為帽子卡的擴展內(nèi)容來進行課余學習。
Javascript框架鱗次櫛比,但基本原理大致相同,因此選用國內(nèi)人開發(fā)的vue.js進行一個初步的嘗試。學習vue.js也一周多的時間了,說起vue的主要用法,無外乎Declarative Rendering、Component System、Client-side Routing、Vue-resource、Axios以及視項目大小而決定是否使用的Vuex,學習vue事小,主要轉(zhuǎn)變思維,面向前后端分離的組件式web開發(fā)才是真正想去實踐的。
正好我的個人網(wǎng)站CodeSheep最近要開發(fā)后臺管理,因此正好用vue這一套來實現(xiàn)了一下。說到后臺管理,繞不開的問題就是權(quán)限的管理。既然想實踐前后端分離這種思想,因此后臺管理的所有web前端的東西應該獨立由前端完成,這其中就包括很重要的由前端來根據(jù)權(quán)限進行相關(guān)東西的控制。我們想要做到的是:不同的權(quán)限對應著不同的路由,同時頁面?zhèn)冗厵谝矐摳鶕?jù)不同的權(quán)限,來異步生成對應的菜單,講白了就是后臺管理時不同權(quán)限的用戶其看到的界面菜單是不一樣的,因此有了這里實現(xiàn)登錄和權(quán)限驗證的一套流程。
具體實現(xiàn)
1、點擊“登錄”按鈕觸發(fā)登錄事件
this.$store.dispatch('LoginByEmail', this.loginForm).then(() => {
this.$router.push({ path: '/' }); //登錄成功之后重定向到首頁
}).catch(err => {
this.$message.error(err); //登錄失敗提示錯誤
});
其中異步觸發(fā)的actions LoginByEmail的處理內(nèi)容如下:
LoginByEmail ({ commit }, userInfo) {
const email = userInfo.email.trim()
return new Promise((resolve, reject) => {
loginByEmail(email, userInfo.password).then(response => {
const data = response.data
setToken(response.data.token)
commit('SET_TOKEN', data.token)
resolve()
}).catch(error => {
reject(error)
})
})
}
很容易看出想做的是將從服務器端拿到的token(唯一標示用戶身份)放到瀏覽器本地Cookie中去
2、全局鉤子router.beforeEach中攔截路由
這一步是核心,具體處理流程示意如下:

路由攔截處理流程
具體代碼如下:
router.beforeEach((to, from, next) => {
if (getToken()) { // 判斷是否取到token
if (to.path === '/login') {
next({ path: '/' })
} else {
if (store.getters.roles.length === 0) { // 判斷當前用戶是否已獲取完user_info信息
store.dispatch('GetInfo').then(res => { // 獲取user_info
const roles = res.data.role
store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可訪問的路由表
router.addRoutes(store.getters.addRouters) // 動態(tài)添加可訪問路由表
next({ ...to }) // 放行路由
})
}).catch(() => {
store.dispatch('FedLogOut').then(() => {
next({ path: '/login' })
})
})
} else {
next() // 放行該路由
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) { // 在免登錄白名單里的路徑,繼續(xù)讓其訪問
next()
} else { // 其他不在白名單里的路徑全部讓其重定向到登錄頁面!
next('/login')
alert('not in white list, now go to the login page')
}
}
})
流程圖中幾個重要步驟解釋一下:
判斷前端是否取到了token令牌:getToken()
操作很簡單,主要是從Cookie中獲取,看token是不是已經(jīng)拿到了:
export function getToken () {
return Cookies.get(TokenKey)
}
vuex異步操作store.dispatch('GetInfo'):獲取用戶信息
GetInfo ({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token).then(response => {
const data = response.data
console.log(data)
commit('SET_ROLES', data.role)
commit('SET_NAME', data.name)
resolve(response)
}).catch(error => {
reject(error)
})
})
}
操作也很簡單,用一個get的restful api從服務器獲取用戶的角色和名字
vuex異步操作store.dispatch('GenerateRoutes', { roles }):根據(jù)不同的roles來生成不同的前臺路由
GenerateRoutes ({ commit }, data) {
return new Promise(resolve => {
const { roles } = data
let accessedRouters
if (roles.indexOf('admin') >= 0) {
accessedRouters = asyncRouter
} else {
accessedRouters = filterAsyncRouter(asyncRouter, roles)
}
commit('SET_ROUTERS', accessedRouters)
resolve()
})
}
從代碼中可以看出,我這是只區(qū)分了管理員角色admin和其他普通用戶(即非Aadmin兩種權(quán)限)
該系列的實踐后續(xù)還將嘗試更多,將會一一撰帖成文,我也是個初學者,路漫漫而求索之。。。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue+webpack 打包文件 404 頁面空白的解決方法
下面小編就為大家分享一篇vue+webpack 打包文件 404 頁面空白的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
詳解Vue自定義指令如何實現(xiàn)處理圖片加載失敗的碎圖
這篇文章主要介紹了詳解Vue自定義指令如何實現(xiàn)處理圖片加載失敗的碎圖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-02-02
Vue官方推薦AJAX組件axios.js使用方法詳解與API
axios是Vue官方推薦AJAX組件,下面為大家介紹axios.js庫的詳細使用方法與API介紹2018-10-10
使用Vue-Router 2實現(xiàn)路由功能實例詳解
vue-router 2只適用于Vue2.x版本,下面我們是基于vue2.0講的如何使用vue-router 2實現(xiàn)路由功能,需要的朋友可以參考下2017-11-11
vuex 第三方包實現(xiàn)數(shù)據(jù)持久化的方法
本文主要介紹了vuex 第三方包實現(xiàn)數(shù)據(jù)持久化的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Vue.js中provide/inject實現(xiàn)響應式數(shù)據(jù)更新的方法示例
這篇文章主要介紹了Vue.js中provide/inject實現(xiàn)響應式數(shù)據(jù)更新,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10

