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:
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 ...).
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.
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)