緣起
如題,想要用geoserver實現(xiàn)一個互聯(lián)網(wǎng)地圖那樣的key許可功能申窘,來控制地圖服務(wù)的訪問權(quán)限弯蚜。
最終想要的效果就是類似下圖中百度地圖那樣,申請個key剃法,可以設(shè)置這個key能訪問哪些地圖服務(wù)資源碎捺,可以設(shè)置應(yīng)用服務(wù)器ip白名單
然后把key放到地圖API中,就能控制地圖服務(wù)的訪問權(quán)限。
可行性分析
要使用geoserver實現(xiàn)上述功能收厨,需要解決下面3個問題:
- 如何實現(xiàn)key驗證訪問悍引?
- 如何控制key能訪問哪些地圖服務(wù)?
- 如何實現(xiàn)服務(wù)器ip白名單帽氓?
如何實現(xiàn)key驗證訪問
geoserver發(fā)布的地圖服務(wù)趣斤,默認沒有進行權(quán)限控制,任何人拿到地址都可以訪問地圖黎休。
我們想要的效果是浓领,在訪問geoserver服務(wù)時,需要在參數(shù)中增加一個key的參數(shù)势腮,有這個key才能訪問地圖联贩。
這個功能,geoserver是支持的
geoserver有個AuthKey的插件捎拯,支持接入外部的身份驗證接口泪幌,我們可以通過自己編寫外部的身份驗證接口,來自己生成key署照、驗證key祸泪,geoserver只負責轉(zhuǎn)發(fā)和獲取驗證結(jié)果。外部接口返回的是geoserver用戶名稱建芙。
然后再設(shè)置一下geoserver的攔截器没隘,規(guī)定哪些請求必須要進行上面的驗證。
如何控制key能訪問哪些地圖服務(wù)禁荸?
key的訪問權(quán)限是通過geoserver用戶的訪問權(quán)限來設(shè)置的右蒲,前面驗證key時,已經(jīng)返回了用戶名赶熟。
用戶的權(quán)限通過角色控制瑰妄,所以每次創(chuàng)建key時,需要同時創(chuàng)建用戶和角色映砖,并設(shè)置角色的訪問權(quán)限间坐。
這個環(huán)節(jié)可以使用geoserver的rest控制接口解決,使用rest控制接口可以通過程序自動完成上述配置啊央。
如何實現(xiàn)服務(wù)器ip白名單
geoserver 作為一個服務(wù)端眶诈,它只能獲取到客戶端的ip,無法獲取到應(yīng)用服務(wù)器的ip瓜饥。
如果想要獲取的應(yīng)用服務(wù)器的ip逝撬,就需要前端有個內(nèi)應(yīng),這個內(nèi)應(yīng)就是js地圖api乓土,它可以在客戶端的地址欄中獲取到應(yīng)用服務(wù)器的ip宪潮,然后傳給服務(wù)端溯警。
具體到geoserver這邊,我們還是利用前面外部驗證接口狡相,在js地圖Api中梯轻,把地址欄獲取到的應(yīng)用服務(wù)器ip和key拼一起,通過 AuthKey 的外部驗證接口轉(zhuǎn)發(fā)給自己的后臺尽棕,后臺再將ip提取出來喳挑。
地址欄ip和key的拼接,可以使用公鑰滔悉、私鑰模式伊诵,js地圖api中使用公鑰加密,后臺使用私鑰解密回官,這樣可以避免明文傳輸ip地址曹宴。防止別人串改ip后非法訪問地圖。
這樣就能實現(xiàn)對應(yīng)用服務(wù)器ip的驗證了歉提。
流程梳理
好了笛坦,現(xiàn)在我們已經(jīng)完成了可行性分析
接下來我們梳理一下,申請key和使用key訪問地圖的流程苔巨。
申請key
- 在申請地圖key的頁面版扩,輸入應(yīng)用名稱、應(yīng)用部署的服務(wù)器ip恋拷、勾選需要的地圖服務(wù)资厉,然后生成個key
- 調(diào)用geoserver的rest控制接口,創(chuàng)建角色蔬顾、用戶、設(shè)置角色可以訪問的地圖服務(wù)
- 將key湘捎、應(yīng)用服務(wù)器ip和geoserver用戶進行關(guān)聯(lián)并保存到數(shù)據(jù)庫
訪問地圖
- 開發(fā)地圖應(yīng)用時诀豁,把申請到的key傳入自己寫的js地圖api
- js地圖api內(nèi)部獲取瀏覽器地址欄ip,這個ip就是應(yīng)用服務(wù)器ip窥妇,將ip和key使用公鑰加密舷胜,生成newkey,并在請求geoserver服務(wù)時將newkey作為參數(shù)傳給geoserver
- geoserver的攔截器攔截到請求后活翩,將newkey提取出來烹骨,轉(zhuǎn)發(fā)給我們自己寫的權(quán)限驗證接口
- 權(quán)限驗證接口接收到newkey后,使用私鑰解密材泄,就能獲取到key和應(yīng)用服務(wù)器ip沮焕,然后去數(shù)據(jù)庫比對是否有符合這兩個條件的數(shù)據(jù),如果有就返回對應(yīng)的geoserver用戶名
- geoserver攔截器接收到驗證接口返回的用戶名后拉宗,查詢該用戶擁有的角色峦树,再比對角色的權(quán)限中是否有本次請求的地圖服務(wù)辣辫。有就返回數(shù)據(jù),沒有就打回魁巩。
這樣一整套流程下來急灭,就實現(xiàn)了用geoserver,實現(xiàn)類似互聯(lián)網(wǎng)地圖那樣的key驗證方式來控制地圖的訪問權(quán)限
實施步驟
接下來詳細介紹一下攔截器設(shè)置和用戶權(quán)限設(shè)置谷遂。
geoserver的攔截器設(shè)置一次就行葬馋。
key、用戶肾扰、角色是一一對應(yīng)的点楼,所以每次新增key時,都要去通過rest接口去新建用戶和角色并設(shè)置角色的地圖訪問權(quán)限白对。
攔截器設(shè)置
這一步其實就是通過界面來配置geoserver的攔截器掠廓,分兩步,一是配置訪問哪些地址時進行攔截甩恼,也就是配置攔截規(guī)則蟀瞧,二是配置攔截下來后驗證key是否有效,也就是配置驗證規(guī)則
具體操作為先配置驗證規(guī)則条摸,再將驗證規(guī)則添加攔截規(guī)則中
配置key驗證規(guī)則
按下圖操作
低版本geoserver可能沒有authkey功能悦污,需要去官網(wǎng)下載對應(yīng)版本的
Key authentication
插件并手動安裝
點擊AuthKey后,會出現(xiàn)下圖中的界面
“1”那里自己隨便填一個钉蒲,比如就叫做uuid_authkey
切端。
“2”那里選擇webservice
。這個選項的意思是顷啼,geoserver會使用外部接口驗證key是否有效踏枣,到時geoserver會通過get方式將key傳給外部接口,外部接口負責驗證key是否有效钙蒙,如果有效就返回用戶名茵瀑。
“3”那里配置外部接口的調(diào)用地址,geoserver調(diào)用時躬厌,會自動將{key}
換成真實的key
其它選項保持默認就可以
我用java寫了個外部接口的示意代碼马昨,來大概說明一下里面的邏輯,其實就是根據(jù)key獲取geoserver用戶名
身份驗證設(shè)置完以后點擊保存按鈕扛施,它就會出現(xiàn)在下面的列表中鸿捧。
配置服務(wù)攔截規(guī)則
接下來我們配置攔截規(guī)則,配置界面如下圖:
我們點擊最下面的 default
把我們剛才設(shè)置的身份驗證規(guī)則添加到 anonymous
規(guī)則前面
這個列表從上到下是身份驗證的先后順序疙渣,
anonymous
的意思是任何人可以匿名訪問匙奴,如果把我們新增的規(guī)則放到了anonymous
的后面,就不會起作用了昌阿。
default
里面能攔截wms和wfs請求饥脑,但不會攔截wmts和tms請求恳邀,我們需要新建一個規(guī)則,用來攔截wmts和tms請求灶轰。
wmts和tms屬于瓦片緩存谣沸,歸geowebcache管理,geowebcache的網(wǎng)絡(luò)請求地址為 gwc
,所以我們新建攔截規(guī)則時笋颤,規(guī)則設(shè)置為/gwc/**
乳附,然后將我們的uuid_authkey
用戶驗證規(guī)則添加上,名稱隨便填一個伴澄,比如 tile
赋除,如下圖:
注意:這個頁面沒有保存按鈕,編輯后需要返回上一個界面進行保存非凌。
添加完成后举农,調(diào)整 tile
規(guī)則的位置,放到 default
上面敞嗡,然后保存颁糟。
這樣就實現(xiàn)了geoserver的key驗證。
用戶權(quán)限設(shè)置
這里直接列出需要使用的rest接口地址
名稱 | 地址 |
---|---|
添加角色 | http://127.0.0.1:7200/geoserver/rest/security/roles/role/{role} |
添加用戶 | http://127.0.0.1:7200/geoserver/rest/security/usergroup/users/ |
用戶指定角色 | http://127.0.0.1:7200/geoserver/rest/security/roles/role/{role}/user/{user} |
設(shè)置角色訪問權(quán)限 | http://127.0.0.1:7200/geoserver/rest/security/acl/layers |
使用rest接口時要注意兩點:
1喉悴、geoserver的rest接口原則上支持xml和json格式的參數(shù)棱貌,但實際不一定,如果你用其中一種格式?jīng)]有成功箕肃,這時不要吊死在一棵樹上婚脱,可以換個格式試試。我就遇到了在添加用戶時xml格式好使json格式不好使勺像,但在設(shè)置權(quán)限時xml格式又不好使障贸,json格式好使。
2咏删、設(shè)置角色訪問權(quán)限
接口的參數(shù)和文檔介紹的有所不同惹想,這里要注意一下,正確的是下面這種:
{
"workspace.*.r": "rolename"
}
geoserver的rest接口說明:https://www.osgeo.cn/geoserver-user-manual/rest/index.html#rest
我用 Postman 導(dǎo)出了一份兒 java Unirest 的代碼督函,供大家參考:http://gisarmory.xyz/blog/index.html?source=geosreverAuthkey
總結(jié)
- geoserver用戶權(quán)限不僅支持對管理界面的控制,還支持對地圖服務(wù)請求的控制
- 地圖服務(wù)的控制需要結(jié)合key驗證的方式實現(xiàn)激挪,通過配置geoserver的攔截器和驗證規(guī)則辰狡,可以把key和用戶關(guān)聯(lián)起來
- geoserver只支持對客戶端ip的驗證,想要驗證應(yīng)用服務(wù)器的ip垄分,需要借助js地圖api實現(xiàn)
參考資料:
- https://blog.csdn.net/a571574085/article/details/115659432
- https://blog.csdn.net/qq_38000851/article/details/113870725
- https://www.cnblogs.com/defineconst/p/13884616.html
- https://www.cnblogs.com/HandyLi/p/8624507.html
- https://www.osgeo.cn/geoserver-user-manual/extensions/geofence-server/index.html
- https://www.osgeo.cn/geoserver-user-manual/rest/index.html#rest
- https://github.com/geoserver/geofence
原文地址:http://gisarmory.xyz/blog/index.html?blog=geosreverAuthkey
歡迎關(guān)注《GIS兵器庫》
本文章采用 知識共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議 進行許可宛篇。歡迎轉(zhuǎn)載、使用薄湿、重新發(fā)布叫倍,但務(wù)必保留文章署名《GIS兵器庫》(包含鏈接: http://gisarmory.xyz/blog/)偷卧,不得用于商業(yè)目的,基于本文修改后的作品務(wù)必以相同的許可發(fā)布吆倦。