我想使用OpenLayers和GeoServer发布地图图层。尽管这很容易设置,但是在身份验证方面我还是有些迷茫。我想要的是创建不同的用户,这些用户将通过使用自己的用户名和密码登录,然后定向到他们自己的地图窗口。如何安全地做到这一点,以使我的用户都无法访问彼此的层?

我知道,例如通过进行查询来“破解”设置非常容易到GeoServer,只需简单地要求它列出所有可用的图层即可。

我有什么选择?我想在ubuntu服务器上设置apache可能会有帮助?有关此主题的任何教程吗?

#1 楼

首先,我认为您应该阅读有关安全性的Geoserver文档。 http://docs.geoserver.org/stable/zh-CN/user/security/index.html您会发现可以使不同的用户或角色可以访问/无法访问图层。

另一种可能的解决方案这将是使外界无法访问geoserver(关闭服务器上用于IP的其他端口(而不是localhost)的8080端口),然后使用您选择的Web编程语言自行创建身份验证机制。

例如:您可以在php中设置某种登录/身份验证,以在身份验证后将请求转发到本地主机上的geoserver。

评论


另外:您可以拥有一个查找表,该表在您的应用程序的用户和GeoServer用户/角色/层之间具有关联,并在GeoServer上应用层级安全性。因此,当OpenLayer的代理请求一个图层时,它将查找相应的Geoserver凭据,对其进行身份验证,然后返回他有权访问的图层。这样,用户可以尝试请求他想要的任何其他层,但除非获得访问权,否则它将无法获得它。

– CaptDragon
2011-11-23 14:35

#2 楼

您可以看一下GeoPrisma


我们需要开发一个对敏感的
数据集具有安全性的Web映射应用程序。这可以通过多个应用程序实现,并且可以通过对它们进行标准的登录+密码访问来实现,但是
项目太大,维护起来非常复杂。
添加一个例如,新的数据集将需要手动修改每个
应用程序,调整安全性等。

这就是为什么我们决定开发自己的包含访问控制的Web映射应用程序的原因使用可用的OpenSource Web映射对数据集进行分析。


http://geoprisma.org/dist/build/html/introduction/index.html

我需要扫描一下文档-如果您的系统上只有几个层/用户,将其添加到一个简单的项目中可能会过头了。
如果您拥有数百个对不同数据集具有编辑权限的用户/组,那么使用诸如GeoPrisma之类的现有项目可能很有意义。

否则,基于HTTP构建的标准Web服务器安全性可能就足够了。

评论


GeoPrisma可以与GeoServer一起使用吗?他们有可靠的往绩记录吗?

– Mimo
2011年11月17日下午13:19

它可以与包括GeoServer在内的任何WMS服务器一起使用。上面添加了评论。

– geoographika
2011年11月17日下午13:40

#3 楼

请调试此语句

$ type = $ _ GET ['FORMAT'];

当您将FORMAT的值作为URL的参数传递时,是否会得到映射(图片)从服务器上获取,如果您正在获取,则您的代理应该可以正常工作。

#4 楼

一种方法是实现这样的代理,该代理可以验证用户使用会话变量登录的凭据,并且仅允许他们访问他们有权使用的资源,即:检查正在调用的层的url并拒绝访问用户无权查看它们。

就他们可能看到的数据而言,如果它是较大数据集的子集,则稍微复杂一些,但我看到两种方法..


使用参数化SQL视图控制用户将看到哪些数据。您可以使用Proxy更改url,然后再使用该用户特定的参数将其传递给Geoserver。用户通过身份验证后,还可以通过Ajax调用将参数发送回Openlayers,并在OpenLayers中作为WMS getMAP调用的一部分提供参数。显示的实际数据可以通过SLD中的变量替换来过滤显示的数据,或者通过在WMS getMap调用中使用外部样式来更改用户用于显示给定图层的SLD。
在用户认证后使用Ajax调用指定地图范围仅允许用户在指定区域内移动。您还可以使用layerVisibility()来限制也可以显示哪些数据。


#5 楼


首先创建一个代理URL(使用您的编程语言)。
此代理URL将访问地理服务器。
在此代理URL中,您可以使用“用户和页面引用”进行身份验证。您可以检查是否从WebApp引用了URL。如果不是简单地发送未经授权的标头。
您将点击此代理URL而不是您的地理服务器URL。
没有人能够知道Geoserver的确切URL是什么,他不会能够破解它。
对于用户安全,只需在代理URL中添加对用户的检查即可。
从“开放层”中将wms-url传递为:http://domainname.com//proxyUrl。 php?user = userid