Einfügen eines Zeilenfilters
Einfügen eines Zeilenfilters

Mit der cardo Rechteverwaltung kann der Zugang zu Datenquellen schon sehr gut geregelt werden. In machen Fällen ist aber ein Zeilenfilter noch wünschenswert.

Für alle datenbankbasierten Geodatenquellen kann ein solcher Filter recht einfach eingerichtet werden.

Der "Trick" besteht darin, dass cardo dem Mapserver die Benutzernamen und die Benutzergruppen mitteilt. Dieser ruft für die Erstellung des SQLs, welches gegen die jeweilige Datenquelle ausgeführt wird, immer eine Methode auf, die evtl. vorhandene Platzhalter in dem Statement ersetzt.

Folgende Platzhalter können in der Datenquelle definiert werden:

  • $userName$ : der Anmeldename (exakt wie übergeben)
  • $groupNamesAsOneString$ : Kommagetrennte Liste aller Gruppennamen, wenn keine Gruppennamen, dann leere Zeichenfolge
  • $groupNamesForIn$: Kommagetrennte Liste aller Gruppennamen, jeder Wert in einfachen Anführungsstrichen eingeschlossen, evtl. leere quotierte Zeichenfolge ('') (Vorgehensweise)

Nutzungsmöglichkeiten

Auf Basis dieses Mechanismus kann z. B. eine zusätzliche Tabelle in der Datenbank erstellt werden, in welcher auch die Geodaten liegen. In dieser Tabelle erfolgt dann eine Zuordnung zu Benutzer-(Gruppen-)namen zu einem Filterausdruck.

Die Abfrage der Datenquelle wird dann so modifiziert, dass eine Verknüpfung zur Filtertabelle hergestellt wird (durch Datenbankmitteln, z. B. .. JOIN ...).

Einfaches Beispiel

Eine Oracle Ebene für die Flurstücke der ALK soll angelegt werden, je nach Benutzer sollen nur Flurstücke ausgewählter Gemeinden zugänglich sein.

Erstellt wurde eine Tabelle ALK_GEMEINDE_ZU_USER, in dieser erfolgt die Zuordnung Gemeindeschlüssel zu Anmeldekennung. In der Ebenendefinition wird diese Tabelle als Filter integriert.

Definition der Quellangabe in der Ebene:

SELECT 
 geom,alknr,zaehler,nenner
FROM  ALK_FL
WHERE 
 gemeinde IN

(
  SELECT gemeinde FROM ALK_GEMEINDE_ZU_USER WHERE USERNAME = '$userName$'
 )
) a

Das Ganze lässt sich diesem Schema folgend auch komplexer gestalten. So ist z. B. die Verwendung von Geometrien als Filter möglich. Der Fantasie sind eigentlich keine Grenzen gesetzt.

Weitere Überlegungen

Achten Sie darauf, dass die Datenbankoperation des Filters sehr schnell ausgeführt wird. Der Filter wird bei jeder Aktion auf die Ebene immer ausgeführt, Zeichnen, Selektion usw.

Beachten Sie, dass die Initialinformationen der Ebene den des ersten Aufrufers entsprechen. Verzichten Sie in diesem Fall besser auf die automatisch ermittelten Informationen und definieren Sie diese an der Ebene (Stichwort: theInitExtent, theCountInfo)