关于gis:geoserver控制服务访问权限类似百度地图的key

缘起

如题,想要用geoserver实现一个互联网地图那样的key许可性能,来管制地图服务的拜访权限。

最终想要的成果就是相似下图中百度地图那样,申请个key,能够设置这个key能拜访哪些地图服务资源,能够设置应用服务器ip白名单

而后把key放到地图API中,就能管制地图服务的拜访权限。

可行性剖析

要应用geoserver实现上述性能,须要解决上面3个问题:

  1. 如何实现key验证拜访?
  2. 如何管制key能拜访哪些地图服务?
  3. 如何实现服务器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

  1. 在申请地图key的页面,输出利用名称、利用部署的服务器ip、勾选须要的地图服务,而后生成个key
  2. 调用geoserver的rest管制接口,创立角色、用户、设置角色能够拜访的地图服务
  3. 将key、应用服务器ip和geoserver用户进行关联并保留到数据库

拜访地图

  1. 开发地图利用时,把申请到的key传入本人写的js地图api
  2. js地图api外部获取浏览器地址栏ip,这个ip就是应用服务器ip,将ip和key应用公钥加密,生成newkey,并在申请geoserver服务时将newkey作为参数传给geoserver
  3. geoserver的拦截器拦挡到申请后,将newkey提取进去,转发给咱们本人写的权限验证接口
  4. 权限验证接口接管到newkey后,应用私钥解密,就能获取到key和应用服务器ip,而后去数据库比对是否有合乎这两个条件的数据,如果有就返回对应的geoserver用户名
  5. 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

总结

  1. geoserver用户权限不仅反对对治理界面的管制,还反对对地图服务申请的管制
  2. 地图服务的管制须要联合key验证的形式实现,通过配置geoserver的拦截器和验证规定,能够把key和用户关联起来
  3. geoserver只反对对客户端ip的验证,想要验证应用服务器的ip,须要借助js地图api实现

参考资料:

  1. https://blog.csdn.net/a571574…
  2. https://blog.csdn.net/qq_3800…
  3. https://www.cnblogs.com/defin…
  4. https://www.cnblogs.com/Handy…
  5. https://www.osgeo.cn/geoserve…
  6. https://www.osgeo.cn/geoserve…
  7. https://github.com/geoserver/…

原文地址:http://gisarmory.xyz/blog/index.html?blog=geosreverAuthkey

欢送关注《GIS兵器库》

本文章采纳 常识共享署名-非商业性应用-雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS兵器库》(蕴含链接:  http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理