2017-09-16 55 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