WMS mit Zugriffskontrolle (ACL) für verschiedene Benutzer? Oder Lösung für Tausende von Punkten auf der Webkarte?


8

Ich habe eine Reihe von Websites zu Tausenden. Nicht alle Benutzer sehen dieselben Sites auf der Karte - also ACL. Daten werden in einer Nicht-GIS-Datenbank (mssql, ora usw.) gespeichert und jetzt mit einer Standard-SQL-Abfrage abgerufen und mit einer JSP an den Client (OpenLayers) zurückgegeben.

Der aktuelle Code ist bereits optimiert, um clientseitiges Clustering (also weniger Chaos auf dem Client, aber alle Daten sind vorhanden) und Bounding-Box-Abruf (also eine Teilmenge von Daten, die jedoch für jeden auf den Server gehen müssen) durchzuführen Schwenken / Zoomen für neue Daten) und sogar serverseitiges Clustering (um die an den Client gelieferten Daten zu reduzieren).

Stattdessen möchte ich Bilder / Kacheln für alle meine Daten generieren, ähnlich wie Google Maps für alle Ergebnisse Tonnen kleiner roter Punkte anzeigt - http://bit.ly/d73qrw [Google Maps-Suche nach "Kaffee"] und auf dem Client anzeigen. Wenn Sie darauf klicken, rufen Sie schnell einen WMS-Dienst an, um Informationen zu erhalten. Das ist zumindest die Idee.

Aber hier ist das Problem: Ich kann nicht einfach einen Standard-WMS-Dienst vor meinen Daten einrichten, da nicht alle Benutzer dieselben Daten sehen. Gibt es eine Möglichkeit, diese Kacheln im laufenden Betrieb zu generieren oder WMS ACL-fähig zu machen?

edit - 22.09.2010 - Also habe ich herausgefunden, wie Google die Kacheln oder vielmehr die Technologie dahinter generiert. Sie verwenden Google Fusion Tables. Speichern Sie N Zeilen in ihren Tabellen. Wenn die Daten lat / lon-fähig sind, kann das Fusion Table-Produkt die Kacheln im laufenden Betrieb (!) Generieren. Dies ist die Art von Dingen, nach denen ich suche - eine performante Karte mit Tonnen von Daten. Aber natürlich muss es ACL-gesteuert sein. Ist es sinnvoll, eine benutzerdefinierte, leichte Implementierung der WMS-Spezifikation zu schreiben oder ein vorhandenes Produkt zu ändern? Obwohl Geoserver viel zu ändern scheint, um ACL zu unterstützen.

edit - 27.09.2010 - Weitere Informationen seit dem Hinzufügen von Kopfgeld. Meine Daten sind in Oracle. Ora räumlich ist nicht aktiviert. Derzeit werden die Daten auf Unternehmensebene extrahiert und in Daten konvertiert, die an den Client gesendet werden, wo der Client die "Punkte" auf der Karte platziert. ACL wird auf der Ebene der Geschäftslogik ausgeführt, nicht auf DB oder ActivDir oder Ähnlichem. Die Authentifizierung ist einfach, die Autorisierung jedoch nicht und musste daher im Code erfasst werden. Möchten Sie wissen, wie Sie am besten einen WMS-Dienst erstellen, um Tausende von "Punkten" auf der Karte bereitzustellen, auf denen jeder Benutzer eine andere Teilmenge von Punkten sieht. Ist die Antwort ein CQL_FILTER? Aber wie werden dann die Parameter eingestellt? Eine Idee, die ich jetzt habe, ist ein zweistufiger Prozess. Führen Sie zuerst eine interne Abfrage aus, um eine Liste der IDs abzurufen, die der Benutzer sehen darf, und erstellen Sie dann eine WMS-Anforderungszeichenfolge mit diesen IDs im Parameter CQL_FILTER. Gibt es etwas, das diesen Prozess vereinfacht? Und wenn ich damit anfange, wie kann ich diese Schicht als "WMS" -Schicht zu einem Open Layers-Client hinzufügen, da für OL der Endpunkt mein Code zum Abrufen von IDs aus der Datenbank ist, nicht der eigentliche WMS-Dienst auf z. B. GeoServer?


@ Liste der IDs in CQL_FILTER: Wenn diese Liste länger wird, wird die Leistung von Geoserver sehr schlecht. Zumindest ist das meine Erfahrung. Ähnliche Frage: gis.stackexchange.com/q/1654/187
underdark

Ich möchte nur sagen, wir haben mit einem sehr ähnlichen Problem gerungen, und ich bin ermutigt, andere darüber sprechen zu hören. Wir haben einige Ideen, aber jede hat ihre eigenen Kompromisse. Ich hoffe, dass ich auf diesen Thread zurückkommen kann, um etwas beizutragen und / oder etwas zu lernen.
LarsH

Antworten:


3

2

Ich denke, dass eine übliche Lösung darin besteht, ein Proxy- oder Wrapper-Skript zu erstellen, das sich zwischen dem Client und WMS befindet. Der Proxy wird verwendet, um einen benutzerdefinierten WMS-Aufruf basierend auf Parametern vom Client zu erstellen.

Sie haben nicht erwähnt, ob Ihr Zweck für dieses Setup die Sicherheit oder nur die Anpassung ist oder welche Informationen der Client benötigt, um zu bestimmen, welche benutzerdefinierte "Ansicht" der Daten das WMS erzeugen soll.

Wenn Sie mehr als ein paar hundert Punkte anzeigen, sollten Sie sich an einen bildbasierten Dienst wie WMS halten. Abhängig von Ihren Anforderungen können Sie MapServer auch einfach hinter ein Wrapper-Skript stellen, das benutzerdefinierte Kartenanforderungen basierend auf eindeutigen Filter- oder Ausdrucksparametern erstellt.


David, der Zweck ist die Anpassung. Sicherheit auch, aber nehmen wir an, dass das erledigt ist. Was der Benutzer sieht, hängt jedoch von seinen Benutzerrechten ab. Also melden sie sich (1) an, (2) öffnen die Karte und sehen dann Sites, die sie sehen dürfen. Können Sie die Idee von MapServer / GeoServer (ich bin ein Java-Typ) hinter einem Wrapper, der mit Filter anfordert, näher erläutern? Meinen Sie wörtlich den Parameter "FILTER" oder "CQL_FILTER" oder etwas anderes? Ich habe die Option CQL_FILTER seit meinem Posten untersucht, konnte sie jedoch nirgendwo online testen.
Vadim

2

Ich habe eine Antwort, die nach einigem Ausprobieren für uns funktioniert hat.

Oracle Spatial + Oracle VPD macht den Trick. Wir verwenden bereits Ora und VPD, daher war dies der nächste logische Schritt. Ora Spatial verfügt über einen WMS-Dienst und kann je nach ihren Rechten / ACL über VPD für verschiedene Benutzer unterschiedlich angepasst werden. Wenn andere nach so etwas suchen, ist mir klar, dass nicht jede Operation Oracle hat oder sich leisten kann, aber wenn Sie es haben, ist es da drin. Ich weiß nicht, ob MS SQL Server ähnliche Funktionen hat.


1

Eine andere Idee (ich bin mir nicht sicher, ob dies wirklich praktisch ist). Was Sie benötigen, ist eine Zuordnung zwischen Benutzerberechtigungen und generierten Zuordnungsdateien. Warum also nicht einen Hash aus der Benutzerberechtigung erstellen und die Kartenkachel / -erweiterung anfordern? Dieser Hash wird einer generierten Kachel zugeordnet. Wenn die Karte nicht vorhanden ist, muss sie offensichtlich generiert werden, andernfalls kann sie aus dem Kartencache abgerufen werden. Natürlich bringt dieser Ansatz keine Vorteile, wenn jeder Benutzer einen völlig anderen Datensatz sieht. Wenn jedoch alle Benutzer einer begrenzten Gruppe von Berechtigungssätzen angehören, sollte dies wirklich hilfreich sein.

Daniel


1

Was ist Ihre Frist? In Geomajas haben wir bereits die Sicherheits- / Datenzugriffsbeschränkungen. Wir arbeiten derzeit am Caching / Rasterisieren, was zu dem System führt, nach dem Sie suchen. Es sollte in ein paar Wochen fertig sein.


Hmmm. Es würde mich interessieren, mehr zu hören. Wir sind nicht in Eile. Wie oben erwähnt (ich weiß, es gibt viel zu lesen), haben wir bereits eine Client + Server-Clustering-Lösung. Aber ich möchte es in eine kachelbasierte Lösung konvertieren, die Google Maps-Kacheln mit vielen Punkten auf einer Kachel ähnelt. Wie fügt sich Ihr Produkt in ein vorhandenes, aber benutzerdefiniertes Sicherheitsmodell ein? Wir sind nicht auf oAuth oder Activ Dir oder so.
Vadim


0

Wahrscheinlich ist diese Lösung verrückt, aber los geht's.

Warum nicht ein WMS-Server pro Benutzer? Nehmen wir an, wir verwenden MapServer. Die MapServer-Konfiguration wird in einer .map-Datei (auch als Mapfile bezeichnet) gespeichert, aber nichts verbietet die Verwendung mehrerer Mapfiles. Wenn eine WMS-Anforderung ausgeführt wird, ist einer der herstellerspezifischen Parameter, die MapServer akzeptiert, 'map', eine Zeichenfolge, die den Pfad und den Dateinamen der verwendeten Map-Datei enthält [1]. Wenn in Ihren WMS-Anforderungen abhängig von der ID des Benutzers, der sich zuvor angemeldet hat, eine andere Map-Datei gesendet wird, werden Sie als WMS-Server als Benutzer und nur mit einer Installation von MapServer angezeigt.

Auf der Sicherheitsseite müssten Sie die verwendete Map-Datei mit einer Sitzungs-ID vergleichen, eine Aufgabe, die wahrscheinlich von einem Proxy zwischen Clients und MapServer ausgeführt wird. Ein Benutzer, der die Karten anderer Benutzer sehen möchte, könnte die URL manuell ändern, indem er den Parameter 'map' ändert, und diese Gegenmaßnahme würde solche Versuche erfolglos machen.

Das Gegenteil (Verrücktheit) dieser Lösung ist, dass für jeden Benutzer eine Map-Datei generiert werden muss. Falls die Anzahl der Benutzer hoch ist, ist diese Lösung natürlich nicht praktikabel, es sei denn, Map-Dateien könnten bei Bedarf mithilfe eines Skripts oder eines ähnlichen Mechanismus automatisch generiert und bei Bedarf aktualisiert werden.

[1] Bei Verwendung von MapServer ist der Parameter 'map' tatsächlich obligatorisch.


Ich schätze das lange Aufschreiben, aber die Lösung ist nicht praktikabel, da das System viele Benutzer hat, die jederzeit hinzugefügt oder entfernt werden können und deren Berechtigungen / Filter zum Anzeigen von Daten jederzeit von einem Administratorkonto geändert werden können.
Vadim

0

Hier gibt es mehrere bewegliche Teile.

Zunächst werden die Punkte gefiltert: Dies sollte auf der Serverseite unmittelbar nach oder während Ihrer SQL-Abfrage erfolgen.

Dann müssen die gefilterten Punkte an den Client zurückgegeben werden.

Das ist der einfache Teil. :) Ich würde empfehlen, dass Sie dies implementieren und dann die Leistung testen und im Idealfall hier aufhören können.

Wenn Sie jedoch zu viele Punkte haben, um sie in OpenLayers effizient anzuzeigen, gelangen Sie zu den Optimierungen, die Google für die kleinen roten Punkte zu tun scheint:

  • Sie müssen einen Kachel-Renderer mit dem vollständigen Satz gefilterter Ergebnisse verbinden, um Kacheln bis auf einen kleinen Punkt pro Ergebnis vollständig transparent zu erstellen. (Designentscheidung: Diese eifrig oder nur auf Anfrage produzieren?)

    • Für GeoServer usw. ist ein Triggercode erforderlich, da pro Abfrage und Benutzer eine neue Ebene erforderlich ist. Wenn Sie Benutzer hinzufügen, müssen Sie neue Dinge hinzufügen, damit GeoServer sie rendern kann. (Außerdem müssen Sie Ergebnisdatensätze in einem Format erstellen, das von der Rendering-Implementierung verwendet werden kann.) Und wie oft werden alte Fliesen neu gerendert?

    • Ich würde ein kleines Stück Servercode empfehlen, mit dem Proxys auf den Kachel-Renderer zugreifen können. Auf diese Weise kann jemand keine Ergebnisse sehen, die ihm nicht gehören, indem er eine URL errät.

  • Als nächstes müssen die Ergebnisse, die an den Browser zurückgegeben werden, partitioniert werden: Die ersten n sind vollständige Ergebnisse, bei denen Markierungen platziert werden, während der Rest als Koordinaten + Rückruf-URL gesendet wird. (Auch wenn es nicht für das Rendern zuständig ist, muss der Browser wissen, wo sie sich befinden, um den Cursor zu ändern, einen Tooltip bereitzustellen und mit einem Klick sinnvolle Aktionen auszuführen!)

  • Dann gibt es den JS-Code im Browser, um Interaktionen mit den Punkten zu verwalten.

Soweit ich weiß, was nicht sehr weit ist, hat niemand "out of the box" -Code geschrieben, um das oben Genannte zu tun: Sie sehen sich eine Reihe von Systemintegrationscodes im Backend und eine ganze Reihe neuer JS im Backend an Vorderes Ende.


Danke Dan. Ich habe viel "Hausmannskost" erwartet, wollte aber unbedingt wissen, ob es eine bessere oder elegantere Lösung gibt. Alte Kacheln sollten häufig neu gerendert werden, da dies Teil eines UMS ist und die Daten ständig aktualisiert werden. Ich habe bereits clientseitiges und serverseitiges Clustering aktiviert. Und es hilft einer Tonne. Weil Tausende von Punkten nur 30-40 werden, wobei die meisten von ihnen Cluster sind (die ich mit einem Pluszeichen rendere). Beim Zoomen / Schwenken werden über die BoundingBox-Strategie neue Daten vom Server geladen. Durch Clustering wird jedoch "Unordnung" von der Karte entfernt. Sie verlieren also das Bild, wie viel Zeug da ist.
Vadim

Ich habe vergessen hinzuzufügen. In gewisser Hinsicht ist "Unordnung" eine gute Sache. Und wir möchten es nicht nur mit einem Kreis variabler Größe darstellen (z. B. großer Kreis für 50 Punkte im Cluster und kleiner Kreis für 10), da er für unseren Anwendungsfall nicht die gleiche Bedeutung hat wie viele kleine Punkte auf der Karte. Seufzer :)
Vadim

Persönlich verachte ich Punkt-Clustering: Es entfernt eine große Menge an Informationen und hat überhaupt keine gute Interpretation. Also bin ich bei dir. Wenn sich Ihre Karten in einer einfachen Projektion wie der typischen Webkarte Spherical Mercator befinden, können Sie das Rendern der Kacheln auch selbst durchführen. (Es ist nicht viel Code, um Lat / Lon in Pixel-X / Y-Koordinaten für eine Kachel umzuwandeln. Ich denke, Sie können Code auf der OpenStreetMap finden.) --- Dadurch wird ein Großteil der Systemintegration, Umleitung usw. beseitigt. Arbeit. (Auf Kosten weniger Funktionen, z. B. können Sie die Punkte nicht so schick machen!)
Dan S.

0

Wenn Sie eine Abfrage haben, die ausgeführt werden kann, um Ihnen mitzuteilen, welche IDs ein Benutzer sehen kann (wie Sie in der letzten Bearbeitung sagen), besteht die "beste" Lösung wahrscheinlich darin, diesen Filter als CQL- oder OGC-Filter als Teil des zu codieren WMS-Anfrage. Möglicherweise müssen Sie die Daten in einer Ansicht neu organisieren, um dies zu ermöglichen.

Bevor Sie anfangen, Tile Caches zu verwenden, würde ich die einfache Version erstellen und prüfen, ob sie schnell genug ist, und dann genau dann komplex werden, wenn Sie mehr Geschwindigkeit benötigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.