朱永強(qiáng) 方 意 宮學(xué)慶
(華東師范大學(xué)計(jì)算機(jī)與軟件工程學(xué)院 上海 200062)
訪問控制是根據(jù)系統(tǒng)設(shè)定的訪問權(quán)限授予認(rèn)證通過的訪問用戶的過程,它作為信息系統(tǒng)的核心內(nèi)容之一,直接影響著一個(gè)系統(tǒng)的安全與效率。隨著互聯(lián)網(wǎng)技術(shù)的快速迭代,微服務(wù)架構(gòu)[1]以其靈活拓展、獨(dú)立部署等優(yōu)點(diǎn)在互聯(lián)網(wǎng)應(yīng)用中被廣泛采用。一些流行的微服務(wù)框架比如Spring Cloud、Dubbo、HSF等在互聯(lián)網(wǎng)公司的主要業(yè)務(wù)中扮演舉足輕重的角色。與此同時(shí),訪問控制在微服務(wù)架構(gòu)的信息系統(tǒng)中會(huì)變得更加復(fù)雜,因此研究該問題有較為重大的意義。
如圖1(a)表示的是單體系統(tǒng)訪問控制流程,單體系統(tǒng)的訪問控制通常采用集中式的管理方式。第1步通過權(quán)限控制模塊識(shí)別用戶的身份信息,并進(jìn)行身份認(rèn)證;第2步根據(jù)已制定的訪問規(guī)則來約束訪問行為;第3步訪問相應(yīng)的功能的業(yè)務(wù)模塊。單體系統(tǒng)的訪問控制模塊跟業(yè)務(wù)模塊在同一進(jìn)程中,通過維護(hù)有狀態(tài)的用戶登錄信息進(jìn)行訪問控制,如Session等技術(shù)。圖1(b)表示的是微服務(wù)架構(gòu)下的訪問控制方式。它將傳統(tǒng)的單體系統(tǒng)根據(jù)業(yè)務(wù)內(nèi)容被拆分成若干個(gè)不同的微服務(wù)實(shí)例,訪問控制模塊可以單獨(dú)成為一個(gè)服務(wù),也可以拆分到在各個(gè)業(yè)務(wù)服務(wù)中。相比較單體系統(tǒng)的訪問控制方式痛點(diǎn)如下:
(1) 當(dāng)訪問者不僅僅是用戶,還包括其他服務(wù)的調(diào)用時(shí),單體系統(tǒng)架構(gòu)下訪問控制的管理方式就不再滿足需求。要考慮訪問入口適用的場景,會(huì)出現(xiàn)用戶與服務(wù)間的鑒權(quán)、服務(wù)與服務(wù)間的鑒權(quán)等多種場景。
(2) 微服務(wù)架構(gòu)下的訪問請(qǐng)求一般是無狀態(tài)的,導(dǎo)致用戶的每次請(qǐng)求都需要進(jìn)行訪問控制,這樣使得訪問控制模塊的訪問壓力變大。
(3) 微服務(wù)架構(gòu)下的系統(tǒng)需要管理一些特有的資源信息,比如對(duì)服務(wù)實(shí)例信息的管理。該管理方式是在傳統(tǒng)負(fù)載均衡技術(shù)的基礎(chǔ)上可以增加對(duì)服務(wù)實(shí)例訪問的管理,對(duì)不同訪問請(qǐng)求設(shè)定提供服務(wù)的實(shí)例信息,從而提高系統(tǒng)管理的靈活性。
訪問控制模型是用來表示訪問者與訪問資源間的關(guān)系,這種關(guān)系是訪問中遵守的規(guī)則與策略。RBAC(Role-Based Access Control)是目前信息系統(tǒng)中廣泛認(rèn)可的訪問控制模型,目前在微服務(wù)架構(gòu)下基于RBAC訪問控制模型還沒有較為成熟的方案。微服務(wù)架構(gòu)下,傳統(tǒng)的權(quán)限管理模型不能滿足微服務(wù)場景的需求,體現(xiàn)在對(duì)不同服務(wù)提供的Restful接口、服務(wù)實(shí)例信息、服務(wù)間調(diào)用權(quán)限等信息的管理。此外,用戶權(quán)限管理數(shù)據(jù)庫與資源數(shù)據(jù)庫是分庫存儲(chǔ)設(shè)計(jì),因此在進(jìn)行權(quán)限的校驗(yàn)操作時(shí)需要對(duì)權(quán)限管理過程進(jìn)行控制。
基于上述痛點(diǎn),本文將在RBAC模型的基礎(chǔ)上提出微服務(wù)下的權(quán)限管理模型MSAM。該模型可以提供一套微服務(wù)架構(gòu)下包含服務(wù)間權(quán)限管理、服務(wù)實(shí)例信息管理等的細(xì)粒度權(quán)限管理機(jī)制。此外,下文還將介紹通過集中式權(quán)限數(shù)據(jù)庫與分布式權(quán)限數(shù)據(jù)庫兩種方式來討論基于微服務(wù)架構(gòu)的訪問控制設(shè)計(jì)方案。
本節(jié)研究并分析了RBAC模型及其衍生模型,并從庫表設(shè)計(jì)、訪問模塊、認(rèn)證與鑒權(quán)框架等方面介紹了相關(guān)的實(shí)現(xiàn)方案。
RBAC模型最初是由D. Ferraiolo 和R. Kuhn提出[2],引入了角色的概念并給出了基本的語義。其主要觀點(diǎn)是將權(quán)限信息賦予給角色來管理,通過給用戶分配不同的角色,從而實(shí)現(xiàn)將權(quán)限對(duì)用戶的分配。
近年來RBAC模型的發(fā)展中,研究較為全面且公認(rèn)的是美國國家標(biāo)準(zhǔn)與技術(shù)研究院于2001年制定出的NIST RBAC模型[3],其中后者是對(duì)前者的抽象與概括。NIST RBAC模型分為4個(gè)層次,從基本到復(fù)雜依次為基本模型Flat RBAC、角色分級(jí)模型Hierarchical RBAC、角色限制模型Constrained RBAC和均衡對(duì)稱模型Symmetric RBAC等4個(gè)等級(jí),這4個(gè)等級(jí)的功能是遞增的。
1.2.1 拓展型權(quán)限管理模型E-RBAC
E-RBAC(Extended Role-Based Access Control)[4]模型是在RBAC模型的基礎(chǔ)上增加了用戶授權(quán)的機(jī)制。如圖2所示,E-RBAC模型通過用戶和角色組合授權(quán)的方法,使得權(quán)限控制的方式變得更加靈活。
圖2 E-RBAC模型圖
該模型在庫表設(shè)計(jì)中用戶信息表與角色信息表為同一張數(shù)據(jù)庫表,并在該表中設(shè)置“是否角色”的字段用來區(qū)分?jǐn)?shù)據(jù)表中的元組是用戶還是角色的元組。該模型考慮了對(duì)數(shù)據(jù)庫空間的合理使用,與傳統(tǒng)的RBAC模型比較,優(yōu)勢在于一方面將用戶信息與角色信息放置在同一張表中管理,通過屬性字段來加以區(qū)分,減少了數(shù)據(jù)庫模式設(shè)計(jì);另一方面提出了增加用戶與權(quán)限進(jìn)行關(guān)聯(lián)的設(shè)計(jì),使用用戶和角色混合授權(quán)。
但隨著用戶信息的增加,這種設(shè)計(jì)方式會(huì)導(dǎo)致數(shù)據(jù)庫表字段出現(xiàn)大量的空值,不利于數(shù)據(jù)庫表的維護(hù)與處理。另外,這種設(shè)計(jì)形式會(huì)增加額外判斷條件的處理,影響訪問控制的效率。
1.2.2 USAM通用權(quán)限管理模型
USAM(Universal Scheme of Authority Management)模型[5]提出了一種管理功能權(quán)限和數(shù)據(jù)權(quán)限更加有效的方式。如圖3所示,該模型在傳統(tǒng)RBAC的功能權(quán)限的基礎(chǔ)上根據(jù)實(shí)際業(yè)務(wù)場景增加了數(shù)據(jù)權(quán)限的管理。該模型拓展了RBAC基本模型,包含用戶、角色、組織表、資源、功能權(quán)限、數(shù)據(jù)類型、數(shù)據(jù)對(duì)象、操作類型等8個(gè)實(shí)體。
圖3 USAM模型圖
該模型相比傳統(tǒng)RBAC模型的優(yōu)勢在于一方面將權(quán)限信息拆分為資源信息與操作類型信息,使得權(quán)限信息更加細(xì)化,方便用戶對(duì)權(quán)限信息的管理;另一方面在用戶、角色、權(quán)限實(shí)體中增加了用戶與角色間對(duì)權(quán)限屏蔽關(guān)系的設(shè)計(jì),可以靈活修改需要屏蔽的角色權(quán)限。
該模型的缺點(diǎn)在于對(duì)角色權(quán)限出現(xiàn)重復(fù)的情況未進(jìn)行分析說明,這種情況下權(quán)限屏蔽操作的維護(hù)信息較難處理。此外,數(shù)據(jù)權(quán)限的管理過于復(fù)雜,影響系統(tǒng)處理效率。
這兩種RBAC的衍生模型雖然在傳統(tǒng)的權(quán)限管理系統(tǒng)都能實(shí)現(xiàn)訪問控制模型的功能,但是在微服務(wù)場景下仍會(huì)出現(xiàn)對(duì)服務(wù)間權(quán)限功能以及數(shù)據(jù)權(quán)限不滿足等問題。所以在微服務(wù)場景下需要提出相應(yīng)的訪問控制模型來實(shí)現(xiàn)對(duì)應(yīng)場景的訪問控制方案。
1.3.1 單點(diǎn)登錄
在微服務(wù)場景下,訪問請(qǐng)求往往是無狀態(tài)的,這就意味著每次請(qǐng)求需要進(jìn)行權(quán)限校驗(yàn),但是系統(tǒng)需要單個(gè)身份認(rèn)證的訪問入口。單點(diǎn)登錄(SSO)[6]使得每個(gè)提供資源的服務(wù)都必須與認(rèn)證服務(wù)交互,這會(huì)產(chǎn)生大量的網(wǎng)絡(luò)開銷,在微應(yīng)用的個(gè)數(shù)增多時(shí),這種方案的弊端會(huì)尤為明顯。
1.3.2 分布式Session方案
分布式Session[7]方案原理是將用戶認(rèn)證的信息存儲(chǔ)在共享內(nèi)存中,通常由用戶Session實(shí)現(xiàn)方式是簡單的分布式哈希映射。當(dāng)用戶登錄微服務(wù)系統(tǒng)后,用戶信息可以從共享存儲(chǔ)中獲取,下一次請(qǐng)求中以Session ID的方式請(qǐng)求,便可獲取用戶信息。該方案是支持高可用且可擴(kuò)展,缺點(diǎn)在于共享存儲(chǔ)需要一定保護(hù)機(jī)制,需要建立安全的鏈接進(jìn)行訪問,這便提高了系統(tǒng)復(fù)雜性。
1.3.3 令牌與API網(wǎng)關(guān)結(jié)合
隨著微服務(wù)、Docker等技術(shù)的興起,基于令牌的認(rèn)證方式已經(jīng)越來越流行。相比較傳統(tǒng)Session中的Session ID,Token不僅僅是一個(gè)key,它包含了用戶的身份信息,通過驗(yàn)證令牌就可以完成身份校驗(yàn)。像微博、QQ等服務(wù)的API很多都是使用該方式進(jìn)行認(rèn)證的。
用戶在首次登錄系統(tǒng)身份信息校驗(yàn)通過后,微服務(wù)授權(quán)服務(wù)會(huì)提供該用戶權(quán)限信息令牌。該令牌由身份驗(yàn)證服務(wù)進(jìn)行簽名,并且必須包含足夠的信息,以便可以在所有微服務(wù)中建立用戶身份。令牌會(huì)附加在每一次訪問請(qǐng)求中,在API網(wǎng)關(guān)進(jìn)行令牌解析,權(quán)限校驗(yàn)通過的請(qǐng)求會(huì)路由之指定提供服務(wù)去處理。
1.4.1 認(rèn)證協(xié)議
認(rèn)證協(xié)議是處理系統(tǒng)驗(yàn)證用戶身份的協(xié)議。OAuth[8]是目前主流的認(rèn)證協(xié)議,OAuth 2.0是OAuth的新版本,更具有簡單易用性。系統(tǒng)開發(fā)者可以通過組織在資源擁有者和服務(wù)提供商之間的交互動(dòng)作來代表用戶,也可以允許授權(quán)給第三方應(yīng)用以獲得訪問的權(quán)限。同時(shí)為Web應(yīng)用、桌面應(yīng)用等場景下提供特定的認(rèn)證流程。
1.4.2 認(rèn)證機(jī)制
JWT(Json web token)[9]是一種基于JSON格式的訪問令牌標(biāo)準(zhǔn),該標(biāo)準(zhǔn)適用于分布式系統(tǒng)中的單點(diǎn)登錄的場景中。JWT的聲明一般被用在系統(tǒng)訪問者和服務(wù)資源擁有者間傳遞認(rèn)證的訪問者身份信息的載體,從而根據(jù)用戶信息對(duì)應(yīng)的權(quán)限獲取資源服務(wù)器的資源。此外,JWT也可直接被用于通過加密進(jìn)行認(rèn)證,從而保證信息的安全性。
JWT的主要優(yōu)勢在于使用無狀態(tài)、可擴(kuò)展的方式處理應(yīng)用中的用戶會(huì)話。服務(wù)端可以通過內(nèi)嵌的的聲明信息,很容易地獲取用戶的會(huì)話信息,而不需要去訪問用戶或會(huì)話的數(shù)據(jù)庫,從而降低數(shù)據(jù)庫的訪問壓力。
1.4.3 鑒權(quán)框架
鑒權(quán)框架Spring Cloud Security[10]基于OAuth2 和OpenID協(xié)議的可配置的單點(diǎn)登錄機(jī)制,并且使用Token保障資源訪問安全。此外,該框架引入U(xiǎn)AA鑒權(quán)服務(wù)[11]。UAA是一種權(quán)限控制的Web服務(wù),該服務(wù)用于管理賬戶、客戶端和訪問控制的問題令牌(Issue Token)。UAA實(shí)現(xiàn)了OAuth2授權(quán)框架和通過運(yùn)用基于JWT的Issue Token來實(shí)現(xiàn)對(duì)訪問控制中權(quán)限傳輸載體的功能。
UAA基于OAuth2[12]的認(rèn)證協(xié)議實(shí)現(xiàn),當(dāng)用戶訪問應(yīng)用時(shí),生成并發(fā)放Token給目標(biāo)客戶端。UAA認(rèn)證服務(wù)包含如下幾個(gè)方面的內(nèi)容: 1) 認(rèn)證對(duì)象。如用戶、代理客戶端以及資源提供服務(wù)器。2) 認(rèn)證類型。主要有授權(quán)碼模式、客戶端模式、密碼模式等類型。3) 認(rèn)證權(quán)限,并作為一個(gè)參數(shù)附加到Access Token上,用于權(quán)限的查詢與鑒別。
本節(jié)中提出了微服務(wù)架構(gòu)下權(quán)限模型MSAM,并與上文提到的兩種基于RBAC模型改進(jìn)的權(quán)限模型進(jìn)行對(duì)比。
MSAM模型在RBAC模型的基礎(chǔ)上將權(quán)限分為了功能權(quán)限與數(shù)據(jù)權(quán)限,如圖4所示。功能權(quán)限表示訪問者對(duì)服務(wù)中提供的功能訪問的權(quán)限,數(shù)據(jù)權(quán)限表示訪問功能時(shí)擁有對(duì)哪些數(shù)據(jù)集信息以及服務(wù)實(shí)例的訪問權(quán)限。
圖4 MSAM模型圖
其中該模型將功能權(quán)限細(xì)化到服務(wù)層面,直接管理服務(wù)內(nèi)的權(quán)限信息,比如服務(wù)A擁有服務(wù)B中接口1的權(quán)限,從而實(shí)現(xiàn)了對(duì)服務(wù)間調(diào)用場景的權(quán)限管理。該模型還在角色權(quán)限賦予的基礎(chǔ)上添加了用戶權(quán)限的賦予與屏蔽功能,用戶權(quán)限可以在角色權(quán)限的基礎(chǔ)上靈活變更。
此外,該模型將數(shù)據(jù)權(quán)限細(xì)化到數(shù)據(jù)集與服務(wù)實(shí)例信息層面,用于微服務(wù)架構(gòu)下服務(wù)信息的管理。實(shí)現(xiàn)方式上通過將數(shù)據(jù)權(quán)限授予給組織,其中組織與實(shí)際的機(jī)構(gòu)信息相關(guān)。數(shù)據(jù)權(quán)限還與用戶進(jìn)行關(guān)聯(lián),支持用戶根據(jù)需求靈活地添加或者屏蔽數(shù)據(jù)權(quán)限。
MSAM模型與上文兩種基于RBAC模型改進(jìn)的權(quán)限模型的功能對(duì)比分析如表1所示。MSAM模型基于微服務(wù)架構(gòu)將權(quán)限信息分為功能權(quán)限與數(shù)據(jù)權(quán)限。功能權(quán)限新增了服務(wù)層面上的功能權(quán)限管理,服務(wù)信息中包含了服務(wù)實(shí)例信息與服務(wù)權(quán)限信息,相同的服務(wù)會(huì)擁有若干個(gè)服務(wù)實(shí)例與相同的服務(wù)權(quán)限。數(shù)據(jù)權(quán)限新增了服務(wù)實(shí)例與數(shù)據(jù)集兩個(gè)維度,某一條數(shù)據(jù)權(quán)限可以實(shí)現(xiàn)控制對(duì)不同服務(wù)實(shí)例的管理。數(shù)據(jù)集指的是某一功能權(quán)限對(duì)可訪問數(shù)據(jù)范圍的集合,比如,數(shù)據(jù)權(quán)限A包含了對(duì)服務(wù)甲中服務(wù)實(shí)例1、2、3的訪問權(quán)限,數(shù)據(jù)集包含了id值在[100,200]的數(shù)據(jù)范圍。此外,實(shí)際環(huán)境下數(shù)據(jù)權(quán)限往往與不同組織以及用戶相關(guān),所以將數(shù)據(jù)權(quán)限與組織機(jī)構(gòu)以及用戶關(guān)聯(lián),用戶可以在組織機(jī)構(gòu)的基礎(chǔ)上實(shí)現(xiàn)對(duì)數(shù)據(jù)權(quán)限的動(dòng)態(tài)管理。
表1中資源數(shù)據(jù)指的是訪問者能夠調(diào)用某接口時(shí)訪問的數(shù)據(jù)。一般功能權(quán)限指的是對(duì)資源數(shù)據(jù)的操作功能。新增用戶特殊權(quán)限與屏蔽用戶特殊權(quán)限指的是用戶能否在角色的基礎(chǔ)上動(dòng)態(tài)管理權(quán)限內(nèi)容。微服務(wù)架構(gòu)數(shù)據(jù)庫分庫設(shè)計(jì)指的是在實(shí)現(xiàn)權(quán)限信息時(shí)可支持分庫設(shè)計(jì)。微服務(wù)架構(gòu)服務(wù)權(quán)限設(shè)計(jì)指的是支持微服務(wù)架構(gòu)下一些特有的資源訪問功能,比如服務(wù)實(shí)例管理功能等信息。
用戶權(quán)限管理數(shù)據(jù)庫庫表設(shè)計(jì)如圖5所示,圖中給出了一些主要屬性。這個(gè)模型有若干實(shí)體表與關(guān)聯(lián)表,實(shí)體表中包含用戶表、角色表、功能權(quán)限表、權(quán)限信息表、組織表、資源表、服務(wù)實(shí)例表、數(shù)據(jù)信息表、服務(wù)信息表、服務(wù)權(quán)限表等。關(guān)聯(lián)表包括用戶角色關(guān)聯(lián)表、角色權(quán)限關(guān)聯(lián)表、用戶權(quán)限屏蔽關(guān)聯(lián)表、用戶權(quán)限新增關(guān)聯(lián)表、組織資源關(guān)聯(lián)表、用戶資源增加表、用戶資源屏蔽表、用戶組織關(guān)聯(lián)表等。下面從具體三方面介紹拓展的內(nèi)容。
圖5 MSAM模型數(shù)據(jù)庫模式圖
3.1.1 功能權(quán)限控制的拓展
在權(quán)限復(fù)雜的管理系統(tǒng)中,角色的權(quán)限內(nèi)容經(jīng)常隨時(shí)間和業(yè)務(wù)發(fā)生變化,不同角色的權(quán)限往往會(huì)出現(xiàn)相互交叉的情況。為了在不變更角色權(quán)限信息的條件下適應(yīng)這種變化,權(quán)限管理需要靈活的基于用戶的權(quán)限管理方式。如圖5(A)所示,在用戶表與權(quán)限表間增加用戶屏蔽權(quán)限關(guān)聯(lián)表和用戶增加權(quán)限關(guān)聯(lián)表,用于實(shí)現(xiàn)用戶靈活的權(quán)限管理。于是,通過定義用戶與權(quán)限表的關(guān)聯(lián)來實(shí)現(xiàn)動(dòng)態(tài)權(quán)限管理,來滿足細(xì)粒度的權(quán)限管理場景。例如,用戶甲擁有角色A,但角色A未包含對(duì)接口a的訪問權(quán)限,此時(shí)只需要在用戶權(quán)限增加關(guān)聯(lián)表中新增該權(quán)限記錄即可。同理,需要去除某一權(quán)限時(shí)在用戶權(quán)限屏蔽關(guān)聯(lián)表中操作。此外,功能權(quán)限設(shè)計(jì)采用分層的方式,低級(jí)別權(quán)限采用前置權(quán)限的編號(hào)方法,高級(jí)別權(quán)限采用后置權(quán)限的編號(hào)方法。比如對(duì)某一接口的訪問權(quán)限的id是100開頭,而對(duì)此接口GET方法的權(quán)限id是10001,PUT方法的權(quán)限id是10002,從而實(shí)現(xiàn)了分層權(quán)限管理功能。
3.1.2 數(shù)據(jù)權(quán)限控制的拓展
通過定義資源表、組織機(jī)構(gòu)表以及組織-資源關(guān)聯(lián)表等,實(shí)現(xiàn)添加數(shù)據(jù)權(quán)限管理功能。在大型組織機(jī)構(gòu)內(nèi)部,數(shù)據(jù)權(quán)限往往跟部門機(jī)構(gòu)相關(guān)聯(lián),本機(jī)構(gòu)只有訪問本機(jī)構(gòu)以及下屬機(jī)構(gòu)的數(shù)據(jù)信息,所以設(shè)計(jì)將機(jī)構(gòu)、資源表與用戶表相關(guān)聯(lián),來實(shí)現(xiàn)動(dòng)態(tài)管理數(shù)據(jù)權(quán)限信息。此外,在功能權(quán)限表中添加資源ids字段,表示該權(quán)限對(duì)應(yīng)的數(shù)據(jù)資源內(nèi)容,從而實(shí)現(xiàn)在訪問指定接口時(shí)不同種數(shù)據(jù)權(quán)限管理的功能。
針對(duì)微服務(wù)場景,如圖5(B)所示,數(shù)據(jù)資源在傳統(tǒng)信息系統(tǒng)之外增加對(duì)服務(wù)實(shí)例信息的管理,使得不同機(jī)構(gòu)的不同用戶可以在同服務(wù)實(shí)例負(fù)載均衡功能之上實(shí)現(xiàn)靈活配置調(diào)用實(shí)例信息,提高服務(wù)調(diào)用的靈活性與可靠性。例如,用戶甲希望手動(dòng)選擇處理某個(gè)調(diào)用的請(qǐng)求服務(wù)實(shí)例時(shí),通過在請(qǐng)求信息中添加對(duì)應(yīng)實(shí)例id,在該類型數(shù)據(jù)權(quán)限的管理模塊中予以控制。
3.1.3 服務(wù)間權(quán)限控制的拓展
定義服務(wù)間調(diào)用權(quán)限管理模塊。服務(wù)間權(quán)限控制數(shù)據(jù)庫表設(shè)計(jì)如圖5(C)所示。通過定義服務(wù)信息表與服務(wù)權(quán)限表一對(duì)多的關(guān)聯(lián)關(guān)系進(jìn)行服務(wù)間權(quán)限的管理。在微服務(wù)應(yīng)用場景下,除了需要管理用戶訪問指定服務(wù)的接口權(quán)限,還需要對(duì)服務(wù)間調(diào)用做權(quán)限管理,從而保證服務(wù)間調(diào)用的安全性。
3.2.1 集中式訪問控制
基于微服務(wù)架構(gòu)的信息系統(tǒng)一般對(duì)外需要一個(gè)訪問入口來實(shí)現(xiàn)訪問控制與路由轉(zhuǎn)發(fā)的網(wǎng)關(guān)功能。網(wǎng)關(guān)與權(quán)限管理服務(wù)關(guān)聯(lián)或者直接訪問權(quán)限數(shù)據(jù)庫,不同的訪問請(qǐng)求在網(wǎng)關(guān)處統(tǒng)一進(jìn)行權(quán)限校驗(yàn),校驗(yàn)通過會(huì)路由到指定的服務(wù)。
集中式訪問控制的關(guān)鍵在于有獨(dú)立于其他服務(wù)的訪問控制服務(wù),該服務(wù)負(fù)責(zé)管理其他服務(wù)對(duì)外提供的接口內(nèi)容的權(quán)限內(nèi)容。如圖6所示,通過該服務(wù)校驗(yàn)的請(qǐng)求可以路由到指定服務(wù)上去;未通過校驗(yàn),則返回客戶端沒有訪問權(quán)限。該種管理方式的優(yōu)勢在于: 一方面訪問控制更加集中,有統(tǒng)一對(duì)外的權(quán)限校驗(yàn)入口,可以將非法請(qǐng)求隔離在系統(tǒng)的外部;另一方面方便訪問控制,可以統(tǒng)一進(jìn)行權(quán)限管理以及維護(hù),提高管理效率。但同時(shí)在大量訪問請(qǐng)求進(jìn)入系統(tǒng)時(shí),鑒權(quán)服務(wù)需要承擔(dān)過大的處理壓力,容易出現(xiàn)性能瓶頸,甚至單點(diǎn)故障。
圖6 集中式訪問控制架構(gòu)圖
這種方式適用于在微服務(wù)系統(tǒng)中服務(wù)實(shí)例相對(duì)較少的場景,在服務(wù)實(shí)例過多時(shí)統(tǒng)一的權(quán)限服務(wù)會(huì)承擔(dān)過大的訪問壓力,從而影響整個(gè)系統(tǒng)的性能。此外,由于權(quán)限統(tǒng)一管理,當(dāng)不同服務(wù)的權(quán)限信息需要隨著業(yè)務(wù)改變時(shí),需要對(duì)統(tǒng)一的權(quán)限服務(wù)進(jìn)行修改,會(huì)出現(xiàn)權(quán)限管理數(shù)據(jù)庫的信息變更甚至權(quán)限服務(wù)的重新部署。所以這種實(shí)現(xiàn)方式適用于訪問權(quán)限相對(duì)比較固定的場景。
3.2.2 分布式訪問控制
微服務(wù)架構(gòu)下分布式訪問控制的關(guān)鍵在于每個(gè)服務(wù)擁有獨(dú)立的訪問控制模塊,如圖7所示。針對(duì)瀏覽器或者其他服務(wù)發(fā)來的請(qǐng)求,通過路由到處理該請(qǐng)求的指定服務(wù),并在服務(wù)內(nèi)部進(jìn)行權(quán)限校驗(yàn),來判斷該請(qǐng)求是否有訪問權(quán)限。此外,不同的服務(wù)可以訪問同一個(gè)權(quán)限數(shù)據(jù)庫,從而減輕維護(hù)成本。與集中式訪問控制方式對(duì)比,分布式權(quán)限管理將權(quán)限的校驗(yàn)功能分布在每個(gè)功能的服務(wù)內(nèi)部,可以提高權(quán)限管理的靈活性。
圖7 分布式訪問控制架構(gòu)圖
這種方式更適用于服務(wù)實(shí)例龐雜且權(quán)限靈活多變的場景,不同的服務(wù)實(shí)例維護(hù)自己的權(quán)限信息,獨(dú)立進(jìn)行訪問控制,在權(quán)限不要變更的情況下不會(huì)對(duì)其他服務(wù)產(chǎn)生影響。
微服務(wù)架構(gòu)下信息管理系統(tǒng)完成鑒權(quán)過程主要分為用戶身份認(rèn)證、用戶權(quán)限查詢匹配、校驗(yàn)權(quán)限是否合法3個(gè)過程,下面詳細(xì)介紹項(xiàng)目中的權(quán)限校驗(yàn)過程。
整體的流程如圖8所示: 首先用戶在登錄頁面通過輸入用戶名與密碼組合,如果提交的用戶密碼信息與后臺(tái)數(shù)據(jù)庫存儲(chǔ)的MD5加密過的密碼信息吻合,則視為身份認(rèn)證通過。接下來授權(quán)服務(wù)通過計(jì)算該用戶角色的權(quán)限與用戶權(quán)限的并集獲取該用戶的權(quán)限信息。UAA服務(wù)根據(jù)用戶與權(quán)限信息生成該用戶Token信息,通過發(fā)放Token信息給客戶端從而實(shí)現(xiàn)訪問控制。
最后,瀏覽器將Token信息存至本地Cookie中,在下次請(qǐng)求中將Cookie中的Token信息放至HTTP請(qǐng)求的頭部。在鑒權(quán)服務(wù)獲取到Token信息后,獲取出此用戶的權(quán)限信息,并將請(qǐng)求的功能權(quán)限與數(shù)據(jù)信息進(jìn)行比對(duì),信息一致的請(qǐng)求路由至指定的服務(wù),不一致則向客戶端回復(fù)沒有訪問權(quán)限。其中集中式權(quán)限管理是路由網(wǎng)關(guān)服務(wù),分布式訪問控制是具體提供功能的服務(wù)。
圖8 權(quán)限校驗(yàn)流程
本文基于微服務(wù)架構(gòu)的信息管理系統(tǒng)改進(jìn)了RBAC模型,形成了一套用戶鑒權(quán)模型MSAM的數(shù)據(jù)權(quán)限的控制,并且增加了服務(wù)間權(quán)限管理處理,可以滿足對(duì)權(quán)限管理要求的靈活性與拓展性。