大家好,我是寶哥!單點(diǎn)登錄是多域名企業(yè)站點(diǎn)流行的登錄方式。本文以現(xiàn)實(shí)生活場(chǎng)景輔助理解,力爭(zhēng)徹底理清 OAuth2.0 實(shí)現(xiàn)單點(diǎn)登錄的原理流程。同時(shí)總結(jié)了權(quán)限控制的實(shí)現(xiàn)方案,及其在微服務(wù)架構(gòu)中的應(yīng)用。 什么是單點(diǎn)登錄 多點(diǎn)登錄傳統(tǒng)的多點(diǎn)登錄系統(tǒng)中,每個(gè)站點(diǎn)都實(shí)現(xiàn)了本站專用的賬號(hào)數(shù)據(jù)庫(kù)和登錄模塊。各站點(diǎn)的登錄狀態(tài)相互不認(rèn)可,各站點(diǎn)需要逐一手工登錄。如下圖,有兩個(gè)術(shù)語(yǔ)含義如下:
![]() 單點(diǎn)登錄 單點(diǎn)登錄,英文是 Single Sign On,縮寫(xiě)為 SSO。多個(gè)站點(diǎn)(192.168.1.20X)共用一臺(tái)認(rèn)證授權(quán)服務(wù)器(192.168.1.110,用戶數(shù)據(jù)庫(kù)和認(rèn)證授權(quán)模塊共用)。 用戶經(jīng)由其中任何一個(gè)站點(diǎn)(比如 192.168.1.201)登錄后,可以免登錄訪問(wèn)其他所有站點(diǎn)。而且,各站點(diǎn)間可以通過(guò)該登錄狀態(tài)直接交互。 ![]() OAuth2認(rèn)證授權(quán)的原理流程 生活實(shí)例【★★重點(diǎn)★★】為了直觀的理解 OAuth2.0 原理流程,我們假設(shè)這樣一個(gè)生活場(chǎng)景: (1)檔案局A(客戶端 / Client):以“檔案局ID/密碼”標(biāo)識(shí),是掌握檔案資源的機(jī)構(gòu)。并列還有很多檔案局B/C/…,每個(gè)檔案局存儲(chǔ)的檔案內(nèi)容(資源 / Resource)不一樣,比如政治、經(jīng)濟(jì)、軍事、文化等; (2)公民張三(資源所有者 / Resource Owner):以“用戶名/密碼”標(biāo)識(shí),需要到各個(gè)檔案局查檔案; (3)派出所(授權(quán)服務(wù)器 / Authentication Server):可以是單個(gè)巨大的派出所,也可以是數(shù)據(jù)共享的派出所集群,掌管的信息、提供的對(duì)外接口功能有:
張三首次訪問(wèn)檔案局A 張三之前從未到訪檔案局,第一次來(lái)檔案局。對(duì)照下圖序號(hào)理解: (1)張三來(lái)到“檔案局A”的“檔案處”,該處要求實(shí)名登記后才能查詢,被指示到“用戶登記處”辦理(HTTP重定向); (2)張三來(lái)到“檔案局A”的“用戶登記處”,既不能證明身份(認(rèn)證),又不能證明自己有查檔案A的權(quán)限(授權(quán))。張三攜帶檔案局A的標(biāo)識(shí)(client-id),被重定向至“授權(quán)信開(kāi)具處”; (3)張三來(lái)到“派出所”的“授權(quán)信開(kāi)具處”,出示檔案局A的標(biāo)識(shí),希望開(kāi)具授權(quán)信(授權(quán))。該處要求首先證明身份(認(rèn)證),被重定向至“用戶身份驗(yàn)證處”; (4)張三來(lái)到“派出所”的“用戶身份驗(yàn)證處”,領(lǐng)取了用戶身份表(網(wǎng)頁(yè)登錄表單 Form); (5)張三填上自己的用戶名和密碼,交給(提交 / Submit)“用戶身份驗(yàn)證處”,該處從私用數(shù)據(jù)庫(kù)中查得用戶名密碼匹配,確定此人是張三,開(kāi)具身份證明信,完成 認(rèn)證。張三帶上身份證明信和檔案局A的標(biāo)識(shí),被重定向至“授權(quán)信開(kāi)具處”; (6)張三再次來(lái)到“授權(quán)信開(kāi)具處”,出示身份證明信和檔案局A的標(biāo)識(shí),該處從私用數(shù)據(jù)庫(kù)中查得,張三的官職是市長(zhǎng)級(jí)別(角色),該官職具有檔案局A的查詢權(quán)限,就開(kāi)具“允許張三查詢檔案局A”的授權(quán)信(授權(quán)碼 / code),張三帶上授權(quán)信被重定向至“檔案局”的“用戶登錄處”; (7)張三到了“檔案局”的“用戶登錄處”,該處私下拿出檔案局A的標(biāo)識(shí)(client-id)和密碼,再附上張三出示的授權(quán)信(code),向“派出所”的“腰牌發(fā)放處”為張三申請(qǐng)的“腰牌”(token),將來(lái)張三可以帶著這個(gè)腰牌表明身份和權(quán)限。又被重定向到“檔案處”; (8)張三的會(huì)話(Session)已經(jīng)關(guān)聯(lián)上了腰牌(token),可以直接通過(guò)“檔案處”查檔案。 ![]() 張三首次訪問(wèn)檔案局B張三已經(jīng)成功訪問(wèn)了檔案局A,現(xiàn)在他要訪問(wèn)檔案局B。對(duì)照下圖序號(hào)理解: (1)/(2) 同上; (3)張三已經(jīng)有“身份證明信”,直接在“派出所”的“授權(quán)信開(kāi)具處”成功開(kāi)具“訪問(wèn)檔案局B”的授權(quán)信; (4)/(5)/(6) 免了; (7)“檔案局B”的“用戶登記處”完成登記; (8)“檔案局B”的“檔案處”查得檔案 ![]() 張三再次訪問(wèn)檔案局A 張三已經(jīng)成功訪問(wèn)了檔案局A,現(xiàn)在他要訪問(wèn)檔案局A。對(duì)照下圖序號(hào)理解: (1)直接成功查到了檔案; (2~8)都免了。 ![]() HTTP 重定向原理HTTP 協(xié)議中,瀏覽器的 REQUEST 發(fā)給服務(wù)器之后,服務(wù)器如果發(fā)現(xiàn)該業(yè)務(wù)不屬于自己管轄,會(huì)把你支派到自身服務(wù)器或其他服務(wù)器(host)的某個(gè)接口(uri)。 正如我們?nèi)フ块T(mén)辦事,每到一個(gè)窗口,工作人員會(huì)說(shuō)“你帶上材料A,到本所的X窗口,或者其他Y所的Z窗口”進(jìn)行下一個(gè)手續(xù)。 ![]() SSO 工作流程至此,就不難理解 OAuth 2.0 的認(rèn)證/授權(quán)流程,此處不再贅述。請(qǐng)拿下圖對(duì)照“2.1 生活實(shí)例”一節(jié)來(lái)理解。 ![]() OAuth2.0 進(jìn)階
根據(jù)官方標(biāo)準(zhǔn),OAuth 2.0 共用四種授權(quán)模式:
![]() 基于 SpringBoot 實(shí)現(xiàn)認(rèn)證/授權(quán) 官方文檔:Spring Cloud Security (https:///nVgcBq) 授權(quán)服務(wù)器(Authorization Server)pom.xml application.properties AuthorizationServerApplication.java 配置授權(quán)服務(wù)的參數(shù) 客戶端(Client, 業(yè)務(wù)網(wǎng)站)pom.xml application.properties 配置 WEB 安全 用戶權(quán)限控制(基于角色)
綜合運(yùn)用 權(quán)限控制方案下圖是基本的認(rèn)證/授權(quán)控制方案,主要設(shè)計(jì)了認(rèn)證授權(quán)服務(wù)器上相關(guān)數(shù)據(jù)表的基本定義??蓪?duì)照本文“2.1 生活實(shí)例”一節(jié)來(lái)理解。
在微服務(wù)架構(gòu)中的應(yīng)用與常規(guī)服務(wù)架構(gòu)不同,在微服務(wù)架構(gòu)中,Authorization Server/Resource Server 是作為微服務(wù)存在的,用戶的登錄可以通過(guò)API網(wǎng)關(guān)一次性完成,無(wú)需與無(wú)法跳轉(zhuǎn)至內(nèi)網(wǎng)的 Authorization Server 來(lái)完成。 ![]()
|
|
|
來(lái)自: 昵稱10087950 > 《開(kāi)發(fā)匯總》