Erstellen Sie einen benutzerdefinierten Authentifizierungsfilter in GeoServer 2.3.0

10

Kontext

In meinem aktuellen Projekt muss überprüft werden, ob Anforderungen an GeoServer (2.3.0) zulässig sind.

Das Projekt enthält diese Fakten:

  • Der GS-Client kann die Hauptinformationen (z. B. das Kennwort) nicht bereitstellen. GS selbst hat keine Verbindung zu einem Benutzer- / Rollen-Repo

Deshalb haben wir die Gelegenheit genutzt, den Auth-Filter-Mechanismus zu verwenden, um Folgendes zu überprüfen:

  • Eine gültige Anforderung (an eine bestimmte WFS-Schicht) enthält einen speziellen HTTP-Header (sagen wir X-CUSTOM-VALID).
  • Dieser Header ist eine JSON-codierte Nachricht, die genügend Informationen enthält, um die Tatsache zu überprüfen, dass die Anforderung von einem Client initiiert wurde, der mit einem gültigen dritten System verbunden war (ein Benutzername, ein Geheimnis, ähnliches).

Status

Die Dokumentation sagt uns, dass wir dazu in der Lage sein sollten ...

In der Dokumentation ist jedoch nicht klar, wie solche Komponenten erstellt werden und wie sie konfiguriert werden sollten.

Debuggen von GeoServer Ich habe festgestellt, dass zum Konfigurieren eines solchen Filters ein dedizierter Authentifizierungsanbieter erforderlich ist. Das, um ein Panel in der Webadministrationsoberfläche zu haben (unter Authentifizierungen in der Liste Authentifizierungsfilter)

Panel

Mein Code besteht also aus folgenden Dateien:

  • ProducteurAuthFilterPanel.java
  • ProducteurAuthFilterPanelInfo.java
  • ProducteurAuthenticationFilterConfig.java
  • ProducteurAuthenticationFilterPanel.html

Diese müssen ein Bedienfeld in der Webadministrationsoberfläche hinzufügen. ProducteurAuthFilterPanelInfoklebt die beiden anderen zusammen mit dem ProducteurAuthenticationFilterHier- Nachher (DER Filter ^^).

Das ProducteurAuthenticationFilterConfigerklärt, dass in seinem Konstruktor:

setClassName(ProducteurAnonymousAuthenticationProvider.class.getName());
setName("producteur");

Filter (und Anbieter)

Nun mussten die Klassen einen Filter erstellen, um in eine Kette aufgenommen zu werden (denke ich):

  • ProducteurAuthenticationFilter : Die Filterimplementierung wird erweitert GeoServerSecurityFilterund implementiertGeoServerAuthenticationFilter
  • ProducteurAnonymousAuthenticationProvider: Wird vom Panel (oben) benötigt, um den neuen Filter zu definieren
  • ProducteurAuthenticationException: Wird im AuthenticationEntryPoint verwendet (derzeit nur Http403ForbiddenEntryPoint).

Schließlich werden die Bohnen wie folgt definiert:

<bean id="yaanonymousFilterProvider" class="dgarne.java.geoserver.security.ProducteurAnonymousAuthenticationProvider"/>

<bean id="producteurAuthPanelInfo" class="dgarne.java.geoserver.security.ProducteurAuthFilterPanelInfo">
    <property name="id" value="security.producteurAuthFilter" />
    <property name="shortTitleKey" value="ProducteurAuthFilterPanel.short"/>
    <property name="titleKey" value="ProducteurAuthFilterPanel.title"/>
    <property name="descriptionKey" value="ProducteurAuthFilterPanel.description"/>
</bean>

Am Ende des Spiels habe ich in der Webadministrationsoberfläche ein neues Element im Filterfeld und es in der Standardzuordnung verwendet (siehe Abbildung unten für Referenzen): Geben Sie hier die Bildbeschreibung ein

Problembeschreibung

Hier sind wir...

Keine meiner von einem Client (OpenLayers) ausgegebenen WFS-Anforderungen, die mit der Standardzuordnung (/ **) übereinstimmen, durchläuft den definierten Filter. Beim Debuggen stellte ich fest, dass die im Spring Context definierten Filterketten niemals meine Definition enthalten, sondern immer die klassische, die entweder anonym, Digest oder Basic verwendet ...

Frage

Kann mich jemand mit einer (viel ^^) vollständigeren Dokumentation darauf hinweisen, wie ich das machen muss?

Andy Petrella
quelle

Antworten:

1

Dazu implementiere ich einen Proxy wie diesen , der die Anmeldeinformationen eines Benutzers anhand von Sitzungsvariablen als angemeldet überprüfen und ihm nur den Zugriff auf Ressourcen ermöglichen kann, auf die er Anspruch hat, dh: Überprüfen Sie die URL für die Ebenen, die aufgerufen werden, und verweigern Sie dem Benutzer den Zugriff ist nicht berechtigt, sie anzuzeigen.

Wenn Sie die Benutzer auf einen bestimmten Bereich oder Funktionsumfang beschränken möchten, gibt es zwei Ansätze.

  1. Verwenden Sie parametrisierte SQL-Ansichten, um zu steuern, welche Daten der Benutzer sehen würde. Sie können den Proxy verwenden, um die URL zu ändern, bevor sie mit den für diesen Benutzer spezifischen Parametern an Geoserver übergeben wird. Sie können die Parameter auch über einen Ajax-Aufruf an Openlayers zurücksenden, nachdem der Benutzer authentifiziert wurde, und die Parameter als Teil des WMS-getMAP-Aufrufs in OpenLayers angeben. Die tatsächlich angezeigten Daten können durch Variablensubstitution in SLD verarbeitet werden , um angezeigte Daten zu filtern, oder durch Verwendung externer Stile in Ihren WMS-getMap-Aufrufen, um die SLD zu ändern, die ein Benutzer zum Anzeigen einer bestimmten Ebene verwendet.

  2. Verwenden Sie nach der Benutzerauthentifizierung einen Ajax-Aufruf, um Map Extents anzugeben , damit sich der Benutzer nur in einem bestimmten Bereich bewegen kann. Sie können auch layerVisibility () verwenden, um einzuschränken, welche Daten ebenfalls angezeigt werden können.

Mark Cupitt
quelle