geoserver控制服務(wù)訪問權(quán)限-類似百度地圖的key

緣起

如題,想要用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)限。

image
image

可行性分析

要使用geoserver實現(xiàn)上述功能收厨,需要解決下面3個問題:

  1. 如何實現(xiàn)key驗證訪問悍引?
  2. 如何控制key能訪問哪些地圖服務(wù)?
  3. 如何實現(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

  1. 在申請地圖key的頁面版扩,輸入應(yīng)用名稱、應(yīng)用部署的服務(wù)器ip恋拷、勾選需要的地圖服務(wù)资厉,然后生成個key
  2. 調(diào)用geoserver的rest控制接口,創(chuàng)建角色蔬顾、用戶、設(shè)置角色可以訪問的地圖服務(wù)
  3. 將key湘捎、應(yīng)用服務(wù)器ip和geoserver用戶進行關(guān)聯(lián)并保存到數(shù)據(jù)庫

訪問地圖

  1. 開發(fā)地圖應(yīng)用時诀豁,把申請到的key傳入自己寫的js地圖api
  2. js地圖api內(nèi)部獲取瀏覽器地址欄ip,這個ip就是應(yīng)用服務(wù)器ip窥妇,將ip和key使用公鑰加密舷胜,生成newkey,并在請求geoserver服務(wù)時將newkey作為參數(shù)傳給geoserver
  3. geoserver的攔截器攔截到請求后活翩,將newkey提取出來烹骨,轉(zhuǎn)發(fā)給我們自己寫的權(quán)限驗證接口
  4. 權(quán)限驗證接口接收到newkey后,使用私鑰解密材泄,就能獲取到key和應(yīng)用服務(wù)器ip沮焕,然后去數(shù)據(jù)庫比對是否有符合這兩個條件的數(shù)據(jù),如果有就返回對應(yīng)的geoserver用戶名
  5. 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ī)則

按下圖操作

image

低版本geoserver可能沒有authkey功能悦污,需要去官網(wǎng)下載對應(yīng)版本的Key authentication插件并手動安裝

image

點擊AuthKey后,會出現(xiàn)下圖中的界面

image

“1”那里自己隨便填一個钉蒲,比如就叫做uuid_authkey切端。

“2”那里選擇webservice。這個選項的意思是顷啼,geoserver會使用外部接口驗證key是否有效踏枣,到時geoserver會通過get方式將key傳給外部接口,外部接口負責驗證key是否有效钙蒙,如果有效就返回用戶名茵瀑。

“3”那里配置外部接口的調(diào)用地址,geoserver調(diào)用時躬厌,會自動將{key}換成真實的key

其它選項保持默認就可以

我用java寫了個外部接口的示意代碼马昨,來大概說明一下里面的邏輯,其實就是根據(jù)key獲取geoserver用戶名

image

身份驗證設(shè)置完以后點擊保存按鈕扛施,它就會出現(xiàn)在下面的列表中鸿捧。

image

配置服務(wù)攔截規(guī)則

接下來我們配置攔截規(guī)則,配置界面如下圖:

image

我們點擊最下面的 default

image

把我們剛才設(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赋除,如下圖:

image

注意:這個頁面沒有保存按鈕,編輯后需要返回上一個界面進行保存非凌。

添加完成后举农,調(diào)整 tile 規(guī)則的位置,放到 default 上面敞嗡,然后保存颁糟。

image

這樣就實現(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é)

  1. geoserver用戶權(quán)限不僅支持對管理界面的控制,還支持對地圖服務(wù)請求的控制
  2. 地圖服務(wù)的控制需要結(jié)合key驗證的方式實現(xiàn)激挪,通過配置geoserver的攔截器和驗證規(guī)則辰狡,可以把key和用戶關(guān)聯(lián)起來
  3. geoserver只支持對客戶端ip的驗證,想要驗證應(yīng)用服務(wù)器的ip垄分,需要借助js地圖api實現(xiàn)


參考資料:

  1. https://blog.csdn.net/a571574085/article/details/115659432
  2. https://blog.csdn.net/qq_38000851/article/details/113870725
  3. https://www.cnblogs.com/defineconst/p/13884616.html
  4. https://www.cnblogs.com/HandyLi/p/8624507.html
  5. https://www.osgeo.cn/geoserver-user-manual/extensions/geofence-server/index.html
  6. https://www.osgeo.cn/geoserver-user-manual/rest/index.html#rest
  7. 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ā)布吆倦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末听诸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚕泽,更是在濱河造成了極大的恐慌晌梨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件须妻,死亡現(xiàn)場離奇詭異仔蝌,居然都是意外死亡,警方通過查閱死者的電腦和手機荒吏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門敛惊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绰更,你說我怎么就攤上這事瞧挤。” “怎么了动知?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵溉瓶,是天一觀的道長。 經(jīng)常有香客問我痛悯,道長嵌巷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任丹皱,我火速辦了婚禮妒穴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摊崭。我一直安慰自己讼油,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布呢簸。 她就那樣靜靜地躺著矮台,像睡著了一般。 火紅的嫁衣襯著肌膚如雪根时。 梳的紋絲不亂的頭發(fā)上瘦赫,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音蛤迎,去河邊找鬼确虱。 笑死,一個胖子當著我的面吹牛替裆,可吹牛的內(nèi)容都是我干的校辩。 我是一名探鬼主播窘问,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宜咒!你這毒婦竟也來了惠赫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤荧呐,失蹤者是張志新(化名)和其女友劉穎汉形,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倍阐,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡概疆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峰搪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岔冀。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖概耻,靈堂內(nèi)的尸體忽然破棺而出使套,到底是詐尸還是另有隱情,我是刑警寧澤鞠柄,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布侦高,位于F島的核電站,受9級特大地震影響厌杜,放射性物質(zhì)發(fā)生泄漏奉呛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一夯尽、第九天 我趴在偏房一處隱蔽的房頂上張望瞧壮。 院中可真熱鬧,春花似錦匙握、人聲如沸咆槽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秦忿。三九已至,卻和暖如春蛾娶,著一層夾襖步出監(jiān)牢的瞬間小渊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工茫叭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人半等。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓揍愁,卻偏偏與公主長得像呐萨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子莽囤,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容