国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

基于vue實(shí)現(xiàn)網(wǎng)站前臺(tái)的權(quán)限管理(前后端分離實(shí)踐)

2019-11-19 14:31:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Javascript做為當(dāng)下的熱門語(yǔ)言,用途很廣泛,從前端到后端處處可見其存在,該技術(shù)如今在我們項(xiàng)目?jī)?nèi)部也大量使用來(lái)開發(fā)諸如CMS系統(tǒng)以及其他其他一些數(shù)據(jù)分析系統(tǒng)的前端頁(yè)面,為此個(gè)人非常感興趣并將其作為帽子卡的擴(kuò)展內(nèi)容來(lái)進(jìn)行課余學(xué)習(xí)。
Javascript框架鱗次櫛比,但基本原理大致相同,因此選用國(guó)內(nèi)人開發(fā)的vue.js進(jìn)行一個(gè)初步的嘗試。學(xué)習(xí)vue.js也一周多的時(shí)間了,說(shuō)起vue的主要用法,無(wú)外乎Declarative Rendering、Component System、Client-side Routing、Vue-resource、Axios以及視項(xiàng)目大小而決定是否使用的Vuex,學(xué)習(xí)vue事小,主要轉(zhuǎn)變思維,面向前后端分離的組件式web開發(fā)才是真正想去實(shí)踐的。

正好我的個(gè)人網(wǎng)站CodeSheep最近要開發(fā)后臺(tái)管理,因此正好用vue這一套來(lái)實(shí)現(xiàn)了一下。說(shuō)到后臺(tái)管理,繞不開的問(wèn)題就是權(quán)限的管理。既然想實(shí)踐前后端分離這種思想,因此后臺(tái)管理的所有web前端的東西應(yīng)該獨(dú)立由前端完成,這其中就包括很重要的由前端來(lái)根據(jù)權(quán)限進(jìn)行相關(guān)東西的控制。我們想要做到的是:不同的權(quán)限對(duì)應(yīng)著不同的路由,同時(shí)頁(yè)面?zhèn)冗厵谝矐?yīng)該根據(jù)不同的權(quán)限,來(lái)異步生成對(duì)應(yīng)的菜單,講白了就是后臺(tái)管理時(shí)不同權(quán)限的用戶其看到的界面菜單是不一樣的,因此有了這里實(shí)現(xiàn)登錄和權(quán)限驗(yàn)證的一套流程。
具體實(shí)現(xiàn)

1、點(diǎn)擊“登錄”按鈕觸發(fā)登錄事件

this.$store.dispatch('LoginByEmail', this.loginForm).then(() => { this.$router.push({ path: '/' }); //登錄成功之后重定向到首頁(yè)}).catch(err => { this.$message.error(err); //登錄失敗提示錯(cuò)誤});

其中異步觸發(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)    })   })  }

很容易看出想做的是將從服務(wù)器端拿到的token(唯一標(biāo)示用戶身份)放到瀏覽器本地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) { // 判斷當(dāng)前用戶是否已獲取完user_info信息    store.dispatch('GetInfo').then(res => { // 獲取user_info     const roles = res.data.role     store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可訪問(wèn)的路由表      router.addRoutes(store.getters.addRouters) // 動(dòng)態(tài)添加可訪問(wèn)路由表      next({ ...to }) // 放行路由     })    }).catch(() => {     store.dispatch('FedLogOut').then(() => {      next({ path: '/login' })     })    })   } else {    next() // 放行該路由   }  } } else {  if (whiteList.indexOf(to.path) !== -1) { // 在免登錄白名單里的路徑,繼續(xù)讓其訪問(wèn)   next()  } else { // 其他不在白名單里的路徑全部讓其重定向到登錄頁(yè)面!   next('/login')   alert('not in white list, now go to the login page')  } }})

流程圖中幾個(gè)重要步驟解釋一下:

判斷前端是否取到了token令牌:getToken()

操作很簡(jiǎn)單,主要是從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)    })   })  }

操作也很簡(jiǎn)單,用一個(gè)get的restful api從服務(wù)器獲取用戶的角色和名字

vuex異步操作store.dispatch('GenerateRoutes', { roles }):根據(jù)不同的roles來(lái)生成不同的前臺(tái)路由

  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)限)

該系列的實(shí)踐后續(xù)還將嘗試更多,將會(huì)一一撰帖成文,我也是個(gè)初學(xué)者,路漫漫而求索之。。。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 深州市| 萨迦县| 金沙县| 株洲市| 阳泉市| 靖州| 铜陵市| 石景山区| 子长县| 遵化市| 遂川县| 信阳市| 阳原县| 西盟| 吉水县| 老河口市| 遂平县| 勃利县| 青浦区| 聂荣县| 北海市| 喀喇沁旗| 喀喇| 嫩江县| 临武县| 吴忠市| 吉林市| 奉新县| 扬州市| 荣昌县| 阜城县| 通辽市| 乌兰察布市| 温泉县| 望谟县| 赞皇县| 蒙自县| 如东县| 舒城县| 古蔺县| 招远市|