開題
遂平ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!最近用vue來(lái)構(gòu)建了一個(gè)小項(xiàng)目,由于項(xiàng)目是以iframe的形式嵌套在別的項(xiàng)目中的,所以對(duì)于登錄的驗(yàn)證就比較的麻煩,索性后端大佬們基于現(xiàn)在的問題提出了解決的方案,在看到他們的解決方案之前,我先畫了一個(gè)比較標(biāo)準(zhǔn)的單系統(tǒng)的解決方案。
本文目錄:
一: 設(shè)想
二: 討論
三:實(shí)現(xiàn)
四:總結(jié)
一: 設(shè)想
簡(jiǎn)單解釋下上圖就是:
首先前端從cookie獲取token,如果沒有token就跳轉(zhuǎn)到登錄頁(yè)面登錄,登錄驗(yàn)證之后生成token存在數(shù)據(jù)庫(kù)中并返回給前端;前端將這個(gè)token保存下來(lái),為了讓在瀏覽器新的tab頁(yè)時(shí)不需要登錄,我們前端需要將這個(gè)token保存到cookie之中。
如果用戶已經(jīng)有了token,那么再驗(yàn)證是否有用戶信息,如果沒有去請(qǐng)求用戶信息的接口,后臺(tái)讀取用戶的基本信息返回給前端,前端根據(jù)后臺(tái)返回的用戶權(quán)限生成固定的路由表用于頁(yè)面攔截。
在用戶token和權(quán)限都有的情況下,進(jìn)入自己權(quán)限內(nèi)的頁(yè)面并且攜帶token訪問后臺(tái)進(jìn)行交互。
用戶在退出時(shí),請(qǐng)求后臺(tái)接口,清除token數(shù)據(jù)。
二: 討論
由于公司的項(xiàng)目更加的復(fù)雜,屬于基于原來(lái)的系統(tǒng)開發(fā)新的系統(tǒng)模塊,但是這些模塊又為了以后主體功能的更新下次迭代需要保持相對(duì)的獨(dú)立性,預(yù)計(jì)以后的老系統(tǒng)只起一個(gè)用戶中心的功能,所以現(xiàn)在是基于實(shí)現(xiàn)單點(diǎn)登錄的能力去迭代更新現(xiàn)在的新的項(xiàng)目。
今天上午對(duì)于登錄的實(shí)現(xiàn)進(jìn)行了相關(guān)討論,由于公司項(xiàng)目保密考慮只是單單做相關(guān)的介紹:
現(xiàn)有的老項(xiàng)目將慢慢向用戶中心轉(zhuǎn)換,而以前的新項(xiàng)目需要去這個(gè)用戶中心獲取登錄信息。具體的實(shí)現(xiàn)是:
登錄新項(xiàng)目b.exaplem.com通過session檢測(cè)到未登錄時(shí)(這里說下新的項(xiàng)目和老項(xiàng)目在同一個(gè)一級(jí)域名下),跳轉(zhuǎn)到a.exaplem.com?returnUrl='b.exaplem.com',在a.exaplem.com下成功登錄后生成一個(gè)ticket給到b.exaplem.com,b.exaplem.com將這個(gè)ticket存在session里面來(lái)保持登錄狀態(tài)。
因?yàn)楝F(xiàn)在基本上是先登錄a.exaplem.com然后再去登錄b.exaplem.com,所以當(dāng)我們第一次進(jìn)入b.exaplem.com系統(tǒng)時(shí),b.exaplem.com會(huì)向a.exaplem.com系統(tǒng)發(fā)送請(qǐng)求來(lái)獲取ticket,并且生成session來(lái)維持登錄狀態(tài)。
三:實(shí)現(xiàn)
當(dāng)時(shí)想通過引入vuex并通過cookie來(lái)保存token的狀態(tài),但是由于現(xiàn)在的項(xiàng)目還是后端以session的形式來(lái)維持用戶的登錄狀態(tài)所以還是沒有引入vuex。
基本實(shí)現(xiàn)如下:
main.js增加引入的permission.js文件如下:
import Vue from 'vue' import router from './router' import { asyncRouterMap, constantRouterMap } from './router' function hasPermission(roles, route) { // if (route.meta && route.meta.role) { return roles.some(role => role === route.meta.role) } else { return true } } function filterAsyncRouter(asyncRouterMap, roles) { const accessedRouters = asyncRouterMap.filter(route => { if (hasPermission(roles, route)) { if (route.children && route.children.length) { route.children = filterAsyncRouter(route.children, roles) } return true } return false }) return accessedRouters } // 加載頁(yè)面之前 router.beforeEach((to, from, next) => { NProgress.start() // 開啟Progress if (to.path == '/ContractAduit/Error') { next() } else if (!Vue.prototype.hasRoute) { Vue.prototype.$ajax.get(Vue.prototype.$api.getModuleHost("用戶信息接口地址"), {}) .then(data => { if (data.code == 1000) { let menus = data.menu let roles = menus.map((menu, index) => { return parseInt(menu.url); }) const accessedRouters = filterAsyncRouter(asyncRouterMap, roles) router.addRoutes(accessedRouters) Vue.prototype.userInfo = { id: data.id, realname: data.realname } Vue.prototype.hasRoute = true; next({...to }) } else { router.push({ name: 'ErrorPageRouter' }); } }) .catch(err => console.log(err)) } else { next() } });
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。