最近在學習Maven,學習到使用Nexus搭建私服,通過Nexus的權限機制可以實現較細粒度的權限控制,這對組織內部的團隊開發很有幫助。通過實驗,我總結了以下一些經驗,可以實現一些權限控制的需求,在此分享也作為自己的備忘錄。
一、Nexus的權限控制機制
Nexus的權限控制采用的是典型的權限(Privilege)和角色(Role)機制。角色與權限是一對多的關聯,用戶與角色也是一對多的關聯。由於Nexus的主要功能就是管理Maven倉庫,所以其權限(Privilege)主要是對倉庫進行CRUD(增查改刪)操作的權限。作為Nexus的用戶,我們能進行管理的就是對倉庫的增刪改查權限,其他的例如UI權限等是Nexus內建的,用戶無法增刪改,這個在下一節會講到。
單個權限(Privilege)所能控制的級別是一個倉庫(Repository,包括Group)中存儲路徑匹配指定正則表達式的一組項目(Artifact)的增刪查改(create,delete,read,update)中的某一個操作。正因為其使用了正則表達式來選定要控制的Artifact所以非常靈活。
二、Nexus內建的權限與角色
Nexus的權限分為三類:
1. 應用權限(Application Privilege):主要是用戶的UI操作權限和系統管理權限,例如通過UI登錄、進行用戶管理等。
2. 倉庫目標權限(Repository Target Privilege):我們作為用戶能自定義的唯一一種權限,就是對倉庫中的項目的CRUD操作權限
3. 倉庫瀏覽權限(Repository View Privilege):通過UI界面瀏覽一個倉庫的權限,在創建每個倉庫時,Nexus會自動創建一個對應該倉庫的View權限,擁有該倉庫的view權限才能在系統的Repositories視圖中看到該倉庫。
以上三類權限中,應用權限和倉庫瀏覽權限兩種是由Nexus創建的,我們並不能對這些權限進行增刪改操作,只能選擇使用或不使用它們。我們能自定義的權限只有倉庫目標權限,一個倉庫目標權限的作用在上一節最后一句話做了解釋。
Nexus在系統中內建了大量的權限和角色,對系統的權限做了初始化的配置,也可以方便我們用戶的權限配置過程。
內建的角色由內建的權限組合而成。
內建的一個角色往往包含多個權限,其中應用權限的顧名思義很好理解,主要是管理倉庫的權限,例如權限管理的權限,用戶管理的權限,倉庫的增刪改權限等。
倉庫瀏覽角色(角色名稱中包含 (View) 的角色),例如 "Repo: All Maven2 Repositories (View)" 這個角色,一般包含了一個或多個倉庫的瀏覽(View)權限。
內建的倉庫目標角色,即那些以"Repo:"開頭,以“(Read)”, "(Full Control)"結尾的角色,用於控制倉庫中的指定項目的訪問。
應用權限的配置就不多講了,我們的重點是如果控制倉庫中項目的訪問。通常我們需要自定倉庫目標、權限和角色來完成較細粒度的控制,但是我們也會結合內置的這些權限角色來方便我們的配置。內置的權限和角色有以下幾個可能入門的時候不太容易直觀理解的點:
1. 配置了某個倉庫的View角色,只能在界面的倉庫列表中看到這個倉庫的存在,並不能讀取其中的Artifact或者進行Artifact的增刪改,只有配置了Read角色才可以進行讀取,配置了Full Control角色才能進行增刪查改全部操作
2. 其實Read角色中已經包含了View權限,也就是說,如果配置了某個倉庫目標的Read角色,則不需要再額外配置View角色了
3. 除了內建的權限和角色,其實還有內建的倉庫目標(Repository Target),內建的倉庫目標權限就是針對這些內建的倉庫目標設置的
三、自定義倉庫目標(repository target)、權限、角色
只使用內建的權限和角色必然無法滿足我們的需求,通常我們希望各個項目組的成員只能看到自己參與的項目並對其進行操作。
剛開始我們一般會想為每個項目創建一個倉庫,再為項目組的成員賦予配置了該倉庫對應操作權限的角色。采用這種做法,我們會發現倉庫列表里會有一大堆倉庫,不利於管理。好在Nexus為我們提供了倉庫目標(Repository Target)的概念。
一個倉庫目標通過一組正則表達式來指定某個倉庫(組)中匹配的那些項目。實際上Nexus的權限也是對倉庫目標進行控制,而不是直接控制倉庫。有了倉庫目標,我們就可以為每個項目創建一個倉庫目標,並對這個倉庫目標進行權限控制,實際上多個項目是存儲在同一個倉庫,例如Releases或者Snapshots,但是不同的用戶能看到並操作的只有我們配置給他的倉庫目標所指定的那些Artifact。
我們可以在菜單 【Views/Repositories】->【Repository Targets】中進行倉庫目標的管理,我們可以在這里看到系統內建的目標,也可以創建(Add)新的目標。創建目標的時候我們可以指定不止一個Pattern Expression(即正則表達式)來匹配倉庫中的Artifact路徑。注意,倉庫目標並不直接跟倉庫關聯,也就是說,倉庫目標只是指定了一組匹配規則,這組規則可以被用來匹配不同倉庫中的Artifact,其通過倉庫目標權限(Repository Target Privilege)與具體的倉庫或倉庫組進行關聯。創建倉庫目標的時候需要不需要指定倉庫,但是需要指定倉庫的類型,雖然類型中有一個選項是Any Content,猜測設置類型可能是為了檢索的效率和可讀性。
關於倉庫目標中指定的正則表達式的規則有以下幾點要說明:
1. 使用的正則表達式是Java的正則表達式語法,與Perl的正則表達式語法有一定差異
2. 匹配的是路徑,不要寫成Java包的語法。路徑的根目錄表示的是指定倉庫的根目錄,例如,GroupId為com.somecom.somegroup的Artifact就可以用 ^/com/somecom/somegroup/.* 來匹配。
3. 我們還可以使用正則表達式的反模式( ?! 關鍵字)來排除一些Artifact,這個非常有用,下面舉個例子。例如有個倉庫組(名字為 All Release)用於存儲所有的發行版本的Artifact,該組包含了Maven 中央倉庫、存儲第三方Artifact的倉庫、存儲組織內部Artifact的倉庫。我們想讓用戶自由訪問Maven中央倉庫和存儲第三方Artifact的倉庫,但是對存儲內部Artifact的倉庫進行更細粒度的控制。假設組織內部Artifact的GroupId前綴總是org.somegroup,那么我們可以使用以下這個正則表達式 ^(?!/org/somegroup/.*).* 創建一個倉庫目標(名字叫做 All Public Releases),這個倉庫目標將組織內部的Artifact排除在規則之外。然后創建一個對All Release 倉庫組的 All Public Releases倉庫目標具有Read權限的權限,然后為每個用戶賦予這個權限(實際上是賦予具有這個權限的角色),這樣每個用戶都可以自由訪問除了組織內部的Artifact之外的其他Artifact了,再結合以上第2點為不同的用戶指定用於匹配其可以訪問的Artifact的倉庫目標。
權限(Privilege)在菜單【Security】→ 【Privileges】進行管理。注意,權限一旦創建便無法修改,只能刪除。用戶可以創建的只有一種權限,就是倉庫目標權限(Repository Target Privilege)。創建權限的時候需要指定權限所控制的倉庫,然后指定一個倉庫目標,這樣我們就把控制的粒度縮小到某個倉庫(組)的某個倉庫目標了,我們上面說過權限控制的是(增刪改查中的)一個操作,但是創建權限的表單中並沒有這一項可以選,那是因為Nexus會自動創建對應增刪查改的四個權限,這為我們減少了不少工作量。每個操作對應權限的名稱為我們指定的Name加上括號以及括號里面的“create”,“read”,“update”,“delete”其中一個。
要跟倉庫目標權限區分的是倉庫(組)的view權限,view權限是Nexus在我們創建倉庫(組)的時候自動創建的,屬於內建的權限,這些權限直接跟倉庫(組)關聯,而不是跟倉庫目標關聯,這些權限也不能被用戶直接刪除。
角色(Role)在菜單【Security】→ 【Roles】進行管理。注意,角色可以包含其他角色,也可以直接包含權限。
最后,我們在菜單【Security】→ 【Users】用戶管理的【config】選項卡的【Role Management】面板進行授權;我們還可以在【Privilege Trace】和【Role Tree】分別以權限和角色的視角查看當前用戶的授權情況。
綜上,權限配置的基本流程如下:
【創建倉庫目標】-指定倉庫(組)-> 【創建權限】→【創建角色】→【為用戶授予(一或多個)角色】
[本文主要作筆記使用,表述可能不夠清晰,也包含一些個人的理解,僅供參考。]