缘起
如题,想要用 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/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。