使用 PostgreSQL 限制用户对层的访问

Limit user access to layers using PostgreSQL

我正在开发一个 WebGIS 项目,其中包含许多使用 GeoServer 提供服务的图层。通过 OpenLayers 3 使用 WMS 访问图层。

所有层的列表存储在 Postgres 中 table 类似这样。

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

此列表很重要,因为加载图层的 javascript 文件是使用 table 生成的。 (我不确定这样做是否正确)。

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'
        })),
});

我有另一个 table 给用户这样的东西。

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

我需要根据用户限制对图层的访问。我最初想到使用 userlevel 来限制对层的访问,但具有相同用户级别的用户将可以访问该级别的所有层。但是我需要一些东西,比如为特定用户提供对特定层的访问。默认情况下,管理员应该能够访问所有层,但 user1 只能访问他被授予访问权限的层。我不了解如何执行此操作,也想不出一种方法来执行此操作。任何有关如何执行此操作的帮助或想法将不胜感激。

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

SQL Fiddle.

GeoServer 直接支持per user layer access as part of its standard security model。因此,与其手动推出自己的解决方案,不如使用提供的经过测试的机制。这允许您使用用户、组和角色设置安全性,这应该具有足够的灵活性来满足您的需求。

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

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