2017-09-16 52 views
0

我正在开发一个WebGIS项目,其中包含大量使用GeoServer服务的图层。使用WMS通过OpenLayers 3访问图层。限制用户使用PostgreSQL访问图层

所有图层的列表都存储在Postgres表中,像这样。

+----+-----------+------------+ 
| id | layername | layerowner | 
+----+-----------+------------+ 
| 1 | layer1 | user1  | 
| 2 | layer2 | user2  | 
| 3 | layer3 | user3  | 
+----+-----------+------------+ 

该列表非常重要,因为使用该表生成加载图层的JavaScript文件。 (我不确定这是否是正确的方式)。

var lyr1 = new ol.layer.Tile({ 
    title: 'LAYERNAME', 
     source: new ol.source.TileWMS(({ 
      url: 'http://localhost:8080/geoserver/WORKSPACE/wms', 
      params:{ 
       'LAYERS': 'LAYERNAME', 
       'TILED': true 
      }, 
      serverType: 'geoserver' 
     })), 
}); 

我有另一个表为用户这样的事情。

+----+----------+-----------+ 
| id | username | userlevel | 
+----+----------+-----------+ 
| 1 | user1 | admin  | 
| 2 | user2 | standard | 
| 3 | user3 | standard | 
+----+----------+-----------+ 

我需要根据用户限制对图层的访问。我最初想到使用userlevel来限制对图层的访问,但具有相同用户级别的用户将有权访问该级别的所有图层。但是我需要为特定用户提供访问特定图层的功能。默认情况下,管理员应该能够访问所有图层,但user1只能访问他被授予访问权的图层。我不知道如何做到这一点,我想不出办法做到这一点。任何帮助或想法如何做到这一点将不胜感激。

编辑:试着为表中的每个用户添加一列,并设置一个布尔值来检查他是否有权访问。我想这不是一个合适的解决方案,因为我需要为每个用户提供一个列。这是SQL小提琴。

SQL Fiddle

+0

行级安全性? –

+0

我想是的。我使用会话变量来检查哪个用户登录,并且用户应该只能访问分配给他的图层(layers表中的行?)。我想我需要一些方法来限制users表中列出的用户访问layers表中的所有图层(行?)。 – pavankguduru

+0

https://www.postgresql.org/docs/current/static/ddl-rowsecurity.html –

回答

1

GeoServer直接支持per user layer access作为其standard security model的一部分。所以,而不是手动滚动你自己的解决方案,你应该使用提供的机制进行测试。这使您可以使用用户,组和角色进行安全设置,这对您的需求应该有很大的灵活性。

特别是,GeoServer提供a JDBC authentication option来使用您现有的表格。

至于获取您应该请求的图层列表并解析getCapabilities文档,该文档将只包含用户有权查看的图层。

+0

谢谢,我正在浏览提供的链接。我认为这应该有所帮助。将尝试它,但我应该为每个访问我的应用程序的用户创建新的GeoServer?还是有办法允许他们使用相同的用户名和密码登录到我的应用程序? – pavankguduru

+0

GeoServer提供JDBC认证选项来使用您的现有表http://docs.geoserver.org/stable/en/user/security/auth/providers.html#jdbc-authentication –

+0

您是否也可以在答案中添加它?谢谢你,我想这解决了我的问题。 – pavankguduru