Wednesday, 23 JUNE
近來一直在研究關於如何在我的WebGIS項目中實現對空間數據(已發布在GeoServer上)進行權限管理的問題。雖然到目前為止沒能找到一個完美的解決方案,但通過這些天的學習與查閱資料,思路上多少有了一些進展,因此記錄下來,做一個簡單的小結。
1-GeoServer中的Security模塊
GeoServer是一個基於J2EE基礎實現的,允許用戶共享和編輯地理空間數據的GIS應用服務器。——FROM GeoServer官方介紹。
其實,GeoServer的本質是一個基於JAVA實現的Web項目工程,我在項目中使用的GeoServer是一個War包版本,直接將其copy到/%TomcatHome%/WebAPP/路徑下,啟動Tomcat,GeoServer就如同你自己的Web項目一樣,被部署在了Tomcat中。當GeoServer被部署完成后,你可以通過http://localhost:yourport(你的端口號)/geoserver進入GeoServer的控制面板。
在控制面板的左側菜單欄中,你很容易能夠找到關於GeoServer的Security設置。接下來我將簡單地介紹一下對已經發布在GeoServer上的資源進行權限分配的相關概念,為了避免這篇博客成為實驗報告,我會盡量減少實際操作部分的描述,主要介紹Security模塊的結構與原理。
1-1 角色
在GeoServer中,角色由三個部分組成:name/parent role/key-value Pairs,其中parent role【父角色】利用了繼承的概念,使得每個角色都可以擁有一個父元素,子角色能夠繼承父角色的所有權限,比如說某個角色A,A_a是A的子角色,A所擁有的所有權限,都能夠被A_a繼承,但A不一定擁有A_a的所有權限,可以理解為,二者是一個遞進的關系,父元素能夠訪問一定權限的資源,子元素的私密性程度更高,在父元素的權限基礎上,能夠擁有更多的資源訪問權力。
任何系統安全模塊的實現都是基於分角色授權的模式。GeoServer也不例外,在GeoServer中,角色服務(role service)主要由以下三個方面實現:
- 角色表
- 授權機制
- GeoServer系統角色與應用角色之間的映射關系(包括了管理員、角色分組)
其中角色表與授權機制都和普通的安全模塊一樣,你可以通過控制面板中可視化設置新的角色,並將其分配給不同的用戶。而GeoServer中的角色與你所設置的角色之間的關聯是GeoServer角色服務的關鍵部分,因為只有當你所新建的角色與系統角色映射關聯之后,才能夠獲得管理GeoServer中數據的權限。
在GeoServer中,角色映射的配置方式主要包括以下兩種:
- XML (默認方式)
- JDBC 通過JDBC,針對數據庫中的用戶表進行權限分配(推薦方式)
一般情況下,你只需要在GeoServer控制面板上的菜單欄中選中Users/groups/Roles一欄,在相應的位置進行設置就可以實現role service的新建、修改和激活,如你需要直觀地查看XML配置文件的結構,可以通過訪問/%GeoServerHome%/data/security/role/{yourRoleServiceName}即可看到你設置的相關角色分配情況。
PS: 在該路徑下,一共有以下三個文件:
- Config.xml: 將本地角色與系統的角色相互映射
- Roles.xml: 設置角色種類,為用戶分配角色信息
- Roles.xsd: 定義service的實現模式
1-2 用戶認證 Authentication
前面的部分基本上圍繞着角色,用戶,用戶組等概念對GeoServer的授權方式進行簡單介紹。但一個完整的用戶權限子系統應該同時具備兩個關鍵內容:授權和認證,所以接下來我們一起來看看GeoServer中的用戶認證(Authentication)方式。
這是左側菜單欄中Authentication-add new authentication filter中配置界面的部分截圖,從截圖中我們可以看出,GeoServer提供了很多種認證方式,其中包括J2EE、Form表單、HTTP Header驗證等等,其中GeoServery以Form表單認證作為默認方案,具體流程如下圖所示
(圖源來自於http://docs.geoserver.org/stable/en/user/security/usergrouprole/interaction.html):
從圖中我們能夠很明顯的理解GeoServer進行用戶認證的大體流程,主要依托於User/Group Service和Role Service兩個服務進行授權和認證,在GeoServer平台上實現了GeoServer工程中的權限控制與管理。
1-3 認證鏈
前面1-2節簡單介紹了一下用戶認證的基本概念和流程,其實在GeoServer的權限功能實現過程中,有一個非常重要的概念——認證鏈,這是理解整個security認證機制的關鍵。
所謂認證鏈,Authentication chain,即一種處理請求並申請相應認證的機制,其中認證機制主要包括以下幾種:
- Username/password:在外接用戶數據庫中查找用戶信息
- Browser cookie:在瀏覽器緩存Cookies中查找之前的認證記錄
- LDAP:根據LDAP數據庫進行認證
- Anonymous:無需認證
多級權限認證機制能夠在GeoServer的一次運行中分別被激活:
從上圖我們可以看出,在請求進入dispatchServlet之前,GeoServer首先對請求進行認證鏈的過濾,請求逐個通過認證鏈上的每一個機制,如果任意一個認證機制能夠成功與請求匹配,則將請求交還到正常請求處理的路徑上,分發到合適的handler上,否則返回錯誤信息401.
實際上,認證鏈過程是由兩個鏈組成的:
a filter chain(過濾鏈):請求是否需要認證 →不需要→ 直接進入處理請求流程
↓
需要
↓
A provider chain(規則鏈):請求與那個權限認證能夠匹配
PS: Filter chain過濾鏈存在的意義在於:
- 從request中收集用戶證書
- 能夠處理例如:登出(logging out)和Remember Me瀏覽器緩存設置等問題
- 管理Session
- 幫助規則鏈接受一些無需認證請求,減少請求負荷
值得注意的是:不同的Filter chain能夠處理不同種類的請求,因此管理員能夠為不同的用戶設置相應的過濾鏈,需要注意的是,如果同時有多條過濾鏈符合請求的時候,僅取第一條符合要求的過濾鏈。
1-4 OWS && REST Services
前面討論的是對角色認證后,用戶角色的狀態變化,而用戶角色認證的結果會影響到用戶在應用中所擁有訪問資源和進行操作的權限分配。接下來要介紹的就是基於OWS (OpenGIS_WebService)and REST service下的認證流程,這兩種風格的服務並沒有session這樣一個概念,所以權限認證體系要求客戶端為每一次請求提供證書,但如果session存在於服務器端,則session能夠用於認證。
1-4-1 OWS Service的認證鏈
-
Session:處理整合session
-
Basic Auth:從HTTP header中提取權限認證證書(Username && passwords)
-
Anonymous:處理匿名訪問【游客】
1-4-2 WMS的認證鏈
具體流程描述:
Ⅰ GetCapabilities request
Ⅱ GetMap request for a secured layer
如上圖,Basic Auth被觸發,判斷是否登陸,如果仍是匿名登陸(Anonymous),則返回給用戶HTTP 401代碼,跳轉到用戶登錄界面,如果完成登陸,則將進入規則鏈,為登陸用戶提供權限之內的資源與操作。
Ⅲ Service
GeoServer對於權限粒度的控制達到了service級別,能夠對用戶的操作(OWS和REST)進行鎖定和控制,在Geoserver中主要有兩Services:OWS(WFS,WMS)和RESTful Service。
- OWS服務
路徑:%GeoServerHome%/data/security/services.properties
e.g:wfs.Transaction = ROLE_WFS_WRITE
wfs.GetFeature = ROLE_WFS_READ
- REST服務
路徑:%GeoServerHome%/data/security/rest.properties
e.g:<uriPattern>;[<method1>,<method2>…]=<role1>,<role2>
/**;GET,POST,PUT,DELETE=ROLE_ADMINISTRATOR
GET方法具有read-only屬性,適合一般用戶訪問,而POST,PUT,DELETE等方法適合具有一定權限的角色使用。
通過各自路徑下存儲的properties文件,將資源、操作方法的操作權限分配給各個角色。
需要注意的是:在GeoServer的官方文檔中提到,Service粒度的權限控制與Layer粒度的權限控制是無法配合使用的,即這兩種控制是相對獨立的,你無法指定特定圖層中的特定OWS服務的請求和操作權限歸屬於某一個角色。
好了,以上便是關於GeoServer security模塊的基本概念與實現原理,我將爭取在這周內實現Spring Security與GeoServer Security的整合,在下一節中介紹如何在自己的Web應用中實現對調用GeoServer中發布的空間數據進行權限管理的內容。