vue3如何實(shí)現(xiàn)單點(diǎn)登錄
嚴(yán)格來(lái)說(shuō),所謂利用vue3實(shí)現(xiàn)單點(diǎn)登錄,是指實(shí)現(xiàn)單點(diǎn)登錄的前端。
身份驗(yàn)證,只能是服務(wù)器端干的活。
一、原理
單點(diǎn)登錄,就是一處登錄,到處運(yùn)行。
以我現(xiàn)在做的項(xiàng)目為例,該項(xiàng)目有多個(gè)子系統(tǒng),采用微服務(wù)架構(gòu),各子系統(tǒng),包括其前端,都是獨(dú)立開發(fā),獨(dú)立部署。那么很自然,應(yīng)當(dāng)有一個(gè)公共登錄。
只需在這個(gè)公共登錄模塊中登錄,那么其他子系統(tǒng)就可以正常使用了。
具體流程
1)當(dāng)打開子系統(tǒng)時(shí),發(fā)現(xiàn)未登錄,則轉(zhuǎn)向公共登錄,否則打開請(qǐng)求頁(yè)面
2)轉(zhuǎn)到公共登錄后,公共登錄檢查是否已登錄,是則附上token返回子系統(tǒng),否則打開登錄頁(yè)面
3)公共登錄成功登錄后,附上token返回子系統(tǒng)
4)子系統(tǒng)使用過(guò)程中,登出后,需要通知公共登錄,公共登錄做相應(yīng)處置
5)前端向后端請(qǐng)求數(shù)據(jù)時(shí),如果后端返回登錄無(wú)效等信息,則做登出處理
二、單點(diǎn)登錄
1、登錄
前端輸入賬號(hào)密碼等,提交到服務(wù)器端,服務(wù)器校驗(yàn)、確認(rèn),生成token返回,登錄成功。
2、登錄狀態(tài)
前端拿到token后,保存在cookie。檢查是否已登錄,就是檢查有沒(méi)有這個(gè)cookie。
選擇cookie而不是localstorage的原因是關(guān)閉瀏覽器后,cookie即失效,而localstorage卻一直保存下來(lái),需要額外處理,麻煩。
const TOKEN_KEY = "token"; export const isLogined = () => { return Cookies.get(TOKEN_KEY); };
3、轉(zhuǎn)向公共登錄
子系統(tǒng)剛開始時(shí)沒(méi)有這個(gè)token,那么轉(zhuǎn)向公共登錄。
跳轉(zhuǎn)時(shí),需要附上返回地址。
vue這類框架,是單頁(yè)面應(yīng)用(SPA),跳轉(zhuǎn)一般用router,但這僅限于系統(tǒng)內(nèi)部;跳到別的系統(tǒng),我找不到有什么方法,只好祭出location.replace()。
1)子系統(tǒng)
export const toLogin = (next) => { const ssoUrl = loginSetup.sso; location.replace(ssoUrl + "?login=" + location.origin); };
2)公共登錄模塊接收、檢查并相應(yīng)處置
//路由守衛(wèi) router.beforeEach((to, from, next) => { //請(qǐng)求登錄 if (to.path !== "/login" && ssoIsToLogin() === true) { if (isLogined()) { ssoReturn(location.href, next("/")); } else { next("/login"); } return; } //請(qǐng)求退出 if (ssoIsToLogout() === true) { ssoLogout(); return; } 。。。 }); export const ssoIsToLogin = () => { return location.href.indexOf("?login") >= 0; }; export const ssoIsToLogout = () => { return location.href.indexOf("?logout") >= 0; }; export const ssoReturn = (origin, defaultDo) => { const p = origin.indexOf("?login="); if (p >= 0) { //附上token返回子系統(tǒng) const url = origin.substr(p + 7) + "?token=" + getToken(); location.replace(url); } else { defaultDo(); } };
三、單點(diǎn)登出
首先,子系統(tǒng)自己先做相應(yīng)處理,比如刪掉cookie;然后通知公共登錄模塊處置。
所謂通知,就是地址帶上參數(shù),跳轉(zhuǎn)到公共登錄模塊。
//登出 logout(() => { toLogout(); }); export const logout = (callback) => { _beforeLogout(callback); }; function _beforeLogout(callback) { //先通知后端退出,然后執(zhí)行相關(guān)操作和回調(diào)函數(shù) logoutApi().then(() => { _clearLoginInfo();//清除cookie等 if (callback) callback(); }); } export const toLogout = () => {//通知登錄模塊 const ssoUrl = loginSetup.sso; location.replace(ssoUrl + "?logout"); };
四、自動(dòng)登錄及登出
1、自動(dòng)登錄
當(dāng)子系統(tǒng)被首次打開時(shí),比如直接在瀏覽器地址欄輸入子系統(tǒng)地址時(shí),系統(tǒng)會(huì)先檢查登錄狀態(tài),發(fā)現(xiàn)未登錄,則轉(zhuǎn)向登錄模塊,見(jiàn)上面 二.3。
2、自動(dòng)登出
有2種情況,一是子系統(tǒng)主動(dòng)登出,二是登錄模塊登出。
子系統(tǒng)主動(dòng)登出,會(huì)先清除本身的登錄狀態(tài),然后通知登錄模塊,執(zhí)行登錄模塊登出,如三所述;如果是登錄模塊登出,那么不會(huì)通知子系統(tǒng)。
但由于token已經(jīng)失效,只要子系統(tǒng)向服務(wù)器端請(qǐng)求數(shù)據(jù),則必然收到相關(guān)信息,觸發(fā)登出處理。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于el-table-column的formatter的使用及說(shuō)明
這篇文章主要介紹了關(guān)于el-table-column的formatter的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例
這篇文章主要介紹了vue+axios實(shí)現(xiàn)文件下載及vue中使用axios的實(shí)例,需要的朋友可以參考下2018-09-09vite.config.ts如何加載.env環(huán)境變量
這篇文章主要介紹了vite.config.ts加載.env環(huán)境變量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10淺談vue項(xiàng)目,訪問(wèn)路徑#號(hào)的問(wèn)題
這篇文章主要介紹了淺談vue項(xiàng)目,訪問(wèn)路徑#號(hào)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08vue通過(guò)ollama接口調(diào)用開源模型實(shí)現(xiàn)人機(jī)對(duì)話功能
文章介紹了如何在本地安裝ollama并配置開源大模型,以及如何通過(guò)JavaScript和Vue.js實(shí)現(xiàn)人機(jī)對(duì)話功能,感興趣的朋友一起看看吧2024-11-11利用vue + element實(shí)現(xiàn)表格分頁(yè)和前端搜索的方法
眾所周知Element 是一套 Vue.js 后臺(tái)組件庫(kù),它能夠幫助你更輕松更快速地開發(fā)后臺(tái)項(xiàng)目。下面這篇文章主要給大家介紹了關(guān)于利用vue + element實(shí)現(xiàn)表格分頁(yè)和前端搜索的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-12-12基于Vite2.x的Vue 3.x項(xiàng)目的搭建實(shí)現(xiàn)
這篇文章主要介紹了基于Vite2.x的Vue 3.x項(xiàng)目的搭建實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04