更新時(shí)間:2023年09月19日10時(shí)43分 來(lái)源:傳智教育 瀏覽次數(shù):
具體思路:
登錄成功后,服務(wù)端會(huì)返回一個(gè)token(該token的是一個(gè)能唯一標(biāo)示用戶(hù)身份的一個(gè)key),之后我們將token存儲(chǔ)在本地cookie之中,這樣下次打開(kāi)頁(yè)面或者刷新頁(yè)面的時(shí)候能記住用戶(hù)的登錄狀態(tài),不用再去登錄頁(yè)面重新登錄了。
ps:為了保證安全性,我司現(xiàn)在后臺(tái)所有token有效期(Expires/Max-Age)都是Session,就是當(dāng)瀏覽器關(guān)閉了就丟失了。重新打開(kāi)游覽器都需要重新登錄驗(yàn)證,后端也會(huì)在每周固定一個(gè)時(shí)間點(diǎn)重新刷新token,讓后臺(tái)用戶(hù)全部重新登錄一次,確保后臺(tái)用戶(hù)不會(huì)因?yàn)殡娔X遺失或者其它原因被人隨意使用賬號(hào)。
用戶(hù)登錄成功之后,我們會(huì)在全局鉤子router.beforeEach中攔截路由,判斷是否已獲得token,在獲得token之后我們就要去獲取用戶(hù)的基本信息了。
頁(yè)面會(huì)先從 cookie 中查看是否存有 token,沒(méi)有,就走一遍上一部分的流程重新登錄,如果有token,就會(huì)把這個(gè) token 返給后端去拉取user_info,保證用戶(hù)信息是最新的。當(dāng)然如果是做了單點(diǎn)登錄得功能的話,用戶(hù)信息存儲(chǔ)在本地也是可以的。當(dāng)你一臺(tái)電腦登錄時(shí),另一臺(tái)會(huì)被提下線,所以總會(huì)重新登錄獲取最新的內(nèi)容。
先說(shuō)一說(shuō)我權(quán)限控制的主體思路,前端會(huì)有一份路由表,它表示了每一個(gè)路由可訪問(wèn)的權(quán)限。當(dāng)用戶(hù)登錄之后,通過(guò)token獲取用戶(hù)的role,動(dòng)態(tài)根據(jù)用戶(hù)的role算出其對(duì)應(yīng)有權(quán)限的路由,再通過(guò) router.addroutes動(dòng)態(tài)掛載路由。但這些控制都只是頁(yè)面級(jí)的,說(shuō)白了前端再怎么做權(quán)限控制都不是絕對(duì)安全的,后端的權(quán)限驗(yàn)證是逃不掉的。
通過(guò)前端來(lái)控制頁(yè)面級(jí)的權(quán)限,不同權(quán)限的用戶(hù)顯示不同的側(cè)邊欄和限制其所能進(jìn)入的頁(yè)面(也做了少許按鈕級(jí)別的權(quán)限控制),后端則會(huì)驗(yàn)證每一個(gè)涉及請(qǐng)求的操作,驗(yàn)證其是否有該操作的權(quán)限,每一個(gè)后臺(tái)的請(qǐng)求不管是 get 還是 post 都會(huì)讓前端在請(qǐng)求header里面攜帶用戶(hù)的token,后端會(huì)根據(jù) 該token來(lái)驗(yàn)證用戶(hù)是否有權(quán)限執(zhí)行該操作。若沒(méi)有權(quán)限則拋出一個(gè)對(duì)應(yīng)的狀態(tài)碼,前端檢測(cè)到該狀態(tài)碼,做出相對(duì)應(yīng)的操作。
使用vuex管理路由表,根據(jù)vuex中可訪問(wèn)的路由渲染側(cè)邊欄組件。
具體實(shí)現(xiàn):
創(chuàng)建vue實(shí)例的時(shí)候?qū)ue-router掛載,但這個(gè)時(shí)候vue-router掛載一些登錄或者不用權(quán)限的公用的頁(yè)面。
當(dāng)用戶(hù)登錄后,獲取用role,將role和路由表每個(gè)頁(yè)面的需要的權(quán)限作比較,生成最終用戶(hù)可訪問(wèn)的路由表。
調(diào)用router.addRoutes(store.getters.addRouters)添加用戶(hù)可訪問(wèn)的路由。
使用vuex管理路由表,根據(jù)vuex中可訪問(wèn)的路由渲染側(cè)邊欄組件。
北京校區(qū)