背景
本文主題是作者在 Spring Cloud 體系下通過(guò) Zuul 網(wǎng)關(guān)來(lái)進(jìn)行認(rèn)證的遷移授權(quán)的前移、統(tǒng)一管理和業(yè)務(wù)服務(wù)進(jìn)行鑒權(quán)的思考和做法。
本文介紹的做法是根據(jù) Zuul 來(lái)做的,對(duì) Zuul 不熟悉的朋友可以看看下面這篇文章,通過(guò)這篇對(duì) Zuul 深入淺出的介紹之后能對(duì) Zuul 有個(gè)大致的了解。
出自方志朋的博客:深入理解Zuul之源碼解析
核心思想
本人認(rèn)為微服務(wù)中權(quán)限的處理應(yīng)該分為兩種:
- 用戶(hù)的權(quán)限控制
- 系統(tǒng)服務(wù)的權(quán)限控制
具體思路
先上圖

Zuul+微服務(wù)鑒權(quán).png

UML時(shí)序圖.png
- 由圖中可以看出將請(qǐng)求簡(jiǎn)單的定義為內(nèi)部請(qǐng)求和外部請(qǐng)求。
再來(lái)分析外部請(qǐng)求(token)
- 本人將
token理解成認(rèn)證的令牌,token完全由 Zuul 來(lái)具體管理(新建、刷新和銷(xiāo)毀)與其他服務(wù)無(wú)關(guān),但是 Zuul 中處理token的動(dòng)作指令由業(yè)務(wù)服務(wù)發(fā)出。 - 用戶(hù)登錄:用戶(hù)請(qǐng)求登錄,
Cookie中無(wú)token,Zuul 不對(duì)其進(jìn)行認(rèn)證(即這個(gè)人我不認(rèn)識(shí),我不管),將請(qǐng)求投遞路由到業(yè)務(wù)服務(wù),業(yè)務(wù)服務(wù)該接口不會(huì)校驗(yàn)其權(quán)限,通過(guò)登錄邏輯處理,登錄成功返回,響應(yīng)頭中增加了登錄成功標(biāo)示和該用戶(hù)權(quán)限角色信息(authentication后文通過(guò)該單詞代替 ),Zuul 接收到信息之后新建token,并將token與authentication對(duì)應(yīng)起來(lái)。 - 用戶(hù)請(qǐng)求信息:
Cookie中有token,校驗(yàn)token的有效性,如果成功將取出對(duì)應(yīng)的authentication,設(shè)置進(jìn)路由的請(qǐng)求頭中,業(yè)務(wù)系統(tǒng)通過(guò)請(qǐng)求頭解析出該用戶(hù)的身份,并鑒權(quán)。 - 用戶(hù)退出登錄:請(qǐng)求部分與
用戶(hù)請(qǐng)求信息一致,返回時(shí)將在響應(yīng)頭中設(shè)置注銷(xiāo)登錄標(biāo)示,Zuul 獲取標(biāo)示之后會(huì)銷(xiāo)毀token與其對(duì)應(yīng)authentication。
最后分析內(nèi)部請(qǐng)求
- 由于是內(nèi)部請(qǐng)求,于是將安全校驗(yàn)的機(jī)制設(shè)置得相對(duì)簡(jiǎn)單了。
- 將每個(gè)
Service理解為一個(gè)獨(dú)立的第三方服務(wù)系統(tǒng),調(diào)用Service理解為請(qǐng)求客戶(hù)系統(tǒng)。 - 凡是想調(diào)用某個(gè)
Service之前,必須先去申請(qǐng)一個(gè)secretKey,然后每個(gè)請(qǐng)求都必須攜帶該secretKey,通過(guò)secretKey可以查出調(diào)用者,控制調(diào)用系統(tǒng)權(quán)限。 - 補(bǔ)充:有人覺(jué)得通過(guò)一個(gè)
secretKey來(lái)處理不夠安全,對(duì)于內(nèi)部請(qǐng)求安全級(jí)別高的,可以對(duì)應(yīng)secretKey設(shè)置 ip白名單,甚至設(shè)置secretKey的有效時(shí)間通過(guò)系統(tǒng)刷新來(lái)刷新secretKey,個(gè)人感覺(jué)大部分的企業(yè)不需要來(lái)刷新secretKey來(lái)提高安全級(jí)別,通過(guò) ip白名單的方式安全程度已經(jīng)夠高了。
總結(jié)
- 本文只介紹了作者在改造系統(tǒng)權(quán)限體系時(shí)的想法思路,文中 Zuul 可以就理解為網(wǎng)關(guān),后面系列將介紹如何在 Zuul 中實(shí)現(xiàn),這里具體實(shí)現(xiàn)就沒(méi)有提及了。
- 作者的
token處理參考了Oauth2.0協(xié)議的token機(jī)制,即具備刷新過(guò)期等機(jī)制,如果感覺(jué)本文有那么一些道理,想繼續(xù)看看我是怎么做的話,可以繼續(xù)關(guān)注,后面有計(jì)劃將整個(gè)實(shí)現(xiàn)機(jī)制開(kāi)源出來(lái)。 - 文中的想法很多是我與公司團(tuán)隊(duì)的想法,歡迎大家與我交流分享,熱烈歡迎指正不對(duì)之處。