缘起
如题,想要用geoserver实现一个互联网地图那样的key许可性能,来管制地图服务的拜访权限。
最终想要的成果就是相似下图中百度地图那样,申请个key,能够设置这个key能拜访哪些地图服务资源,能够设置应用服务器ip白名单
而后把key放到地图API中,就能管制地图服务的拜访权限。
可行性剖析
要应用geoserver实现上述性能,须要解决上面3个问题:
- 如何实现key验证拜访?
- 如何管制key能拜访哪些地图服务?
- 如何实现服务器ip白名单?
如何实现key验证拜访
geoserver公布的地图服务,默认没有进行权限管制,任何人拿到地址都能够拜访地图。
咱们想要的成果是,在拜访geoserver服务时,须要在参数中减少一个key的参数,有这个key能力拜访地图。
这个性能,geoserver是反对的
geoserver有个AuthKey的插件,反对接入内部的身份验证接口,咱们能够通过本人编写内部的身份验证接口,来本人生成key、验证key,geoserver只负责转发和获取验证后果。内部接口返回的是geoserver用户名称。
而后再设置一下geoserver的拦截器,规定哪些申请必须要进行下面的验证。
如何管制key能拜访哪些地图服务?
key的拜访权限是通过geoserver用户的拜访权限来设置的,后面验证key时,曾经返回了用户名。
用户的权限通过角色管制,所以每次创立key时,须要同时创立用户和角色,并设置角色的拜访权限。
这个环节能够应用geoserver的rest管制接口解决,应用rest管制接口能够通过程序主动实现上述配置。
如何实现服务器ip白名单
geoserver 作为一个服务端,它只能获取到客户端的ip,无奈获取到应用服务器的ip。
如果想要获取的应用服务器的ip,就须要前端有个内应,这个内应就是js地图api,它能够在客户端的地址栏中获取到应用服务器的ip,而后传给服务端。
具体到geoserver这边,咱们还是利用后面内部验证接口,在js地图Api中,把地址栏获取到的应用服务器ip和key拼一起,通过 AuthKey 的内部验证接口转发给本人的后盾,后盾再将ip提取进去。
地址栏ip和key的拼接,能够应用公钥、私钥模式,js地图api中应用公钥加密,后盾应用私钥解密,这样能够防止明文传输ip地址。避免他人串改ip后非法拜访地图。
这样就能实现对应用服务器ip的验证了。
流程梳理
好了,当初咱们曾经实现了可行性剖析
接下来咱们梳理一下,申请key和应用key拜访地图的流程。
申请key
- 在申请地图key的页面,输出利用名称、利用部署的服务器ip、勾选须要的地图服务,而后生成个key
- 调用geoserver的rest管制接口,创立角色、用户、设置角色能够拜访的地图服务
- 将key、应用服务器ip和geoserver用户进行关联并保留到数据库
拜访地图
- 开发地图利用时,把申请到的key传入本人写的js地图api
- js地图api外部获取浏览器地址栏ip,这个ip就是应用服务器ip,将ip和key应用公钥加密,生成newkey,并在申请geoserver服务时将newkey作为参数传给geoserver
- geoserver的拦截器拦挡到申请后,将newkey提取进去,转发给咱们本人写的权限验证接口
- 权限验证接口接管到newkey后,应用私钥解密,就能获取到key和应用服务器ip,而后去数据库比对是否有合乎这两个条件的数据,如果有就返回对应的geoserver用户名
- geoserver拦截器接管到验证接口返回的用户名后,查问该用户领有的角色,再比对角色的权限中是否有本次申请的地图服务。有就返回数据,没有就打回。
这样一整套流程下来,就实现了用geoserver,实现相似互联网地图那样的key验证形式来管制地图的拜访权限
施行步骤
接下来具体介绍一下拦截器设置和用户权限设置。
geoserver的拦截器设置一次就行。
key、用户、角色是一一对应的,所以每次新增key时,都要去通过rest接口去新建用户和角色并设置角色的地图拜访权限。
拦截器设置
这一步其实就是通过界面来配置geoserver的拦截器,分两步,一是配置拜访哪些地址时进行拦挡,也就是配置拦挡规定,二是配置拦挡下来后验证key是否无效,也就是配置验证规定
具体操作为先配置验证规定,再将验证规定增加拦挡规定中
配置key验证规定
按下图操作
低版本geoserver可能没有authkey性能,须要去官网下载对应版本的
Key authentication
插件并手动装置
点击AuthKey后,会呈现下图中的界面
“1”那里本人轻易填一个,比方就叫做uuid_authkey
。
“2”那里抉择webservice
。这个选项的意思是,geoserver会应用内部接口验证key是否无效,到时geoserver会通过get形式将key传给内部接口,内部接口负责验证key是否无效,如果无效就返回用户名。
“3”那里配置内部接口的调用地址,geoserver调用时,会主动将{key}
换成实在的key
其它选项放弃默认就能够
我用java写了个内部接口的示意代码,来大略阐明一下外面的逻辑,其实就是依据key获取geoserver用户名
身份验证设置完当前点击保留按钮,它就会呈现在上面的列表中。
配置服务拦挡规定
接下来咱们配置拦挡规定,配置界面如下图:
咱们点击最上面的 default
把咱们方才设置的身份验证规定增加到 anonymous
规定后面
这个列表从上到下是身份验证的先后顺序,
anonymous
的意思是任何人能够匿名拜访,如果把咱们新增的规定放到了anonymous
的前面,就不会起作用了。
default
外面能拦挡wms和wfs申请,但不会拦挡wmts和tms申请,咱们须要新建一个规定,用来拦挡wmts和tms申请。
wmts和tms属于瓦片缓存,归geowebcache治理,geowebcache的网络申请地址为 gwc
,所以咱们新建拦挡规定时,规定设置为/gwc/**
,而后将咱们的uuid_authkey
用户验证规定增加上,名称轻易填一个,比方 tile
,如下图:
留神:这个页面没有保留按钮,编辑后须要返回上一个界面进行保留。
增加实现后,调整 tile
规定的地位,放到 default
下面,而后保留。
这样就实现了geoserver的key验证。
用户权限设置
这里间接列出须要应用的rest接口地址
名称 | 地址 |
---|---|
增加角色 | http://127.0.0.1:7200/geoserv…{role} |
增加用户 | http://127.0.0.1:7200/geoserv… |
用户指定角色 | http://127.0.0.1:7200/geoserv…{role}/user/{user} |
设置角色拜访权限 | http://127.0.0.1:7200/geoserv… |
应用rest接口时要留神两点:
1、geoserver的rest接口原则上反对xml和json格局的参数,但理论不肯定,如果你用其中一种格局没有胜利,这时不要吊死在一棵树上,能够换个格局试试。我就遇到了在增加用户时xml格局好使json格局不好使,但在设置权限时xml格局又不好使,json格局好使。
2、设置角色拜访权限
接口的参数和文档介绍的有所不同,这里要留神一下,正确的是上面这种:
{
"workspace.*.r": "rolename"
}
geoserver的rest接口阐明:https://www.osgeo.cn/geoserver-user-manual/rest/index.html#rest
我用 Postman 导出了一份儿 java Unirest 的代码,供大家参考:http://gisarmory.xyz/blog/index.html?source=geosreverAuthkey
总结
- geoserver用户权限不仅反对对治理界面的管制,还反对对地图服务申请的管制
- 地图服务的管制须要联合key验证的形式实现,通过配置geoserver的拦截器和验证规定,能够把key和用户关联起来
- geoserver只反对对客户端ip的验证,想要验证应用服务器的ip,须要借助js地图api实现
参考资料:
- https://blog.csdn.net/a571574…
- https://blog.csdn.net/qq_3800…
- https://www.cnblogs.com/defin…
- https://www.cnblogs.com/Handy…
- https://www.osgeo.cn/geoserve…
- https://www.osgeo.cn/geoserve…
- https://github.com/geoserver/…
原文地址:http://gisarmory.xyz/blog/index.html?blog=geosreverAuthkey
欢送关注《GIS兵器库》
本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接: http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。
发表回复