Utwórz niestandardowy filtr uwierzytelniania w GeoServer 2.3.0

10

Kontekst

W moim bieżącym projekcie wymagam sprawdzenia, czy żądania przychodzące do GeoServer (2.3.0) są dozwolone.

Projekt zawiera następujące fakty:

  • klient GS nie może podać głównych informacji (na przykład hasła), sam GS nie ma połączenia z repozytorium użytkownika / roli

Skorzystaliśmy więc z okazji, aby użyć mechanizmu filtra uwierzytelniania, aby sprawdzić, czy:

  • prawidłowe żądanie (do określonej warstwy WFS) zawiera specjalny nagłówek HTTP (powiedzmy X-CUSTOM-VALID)
  • Ten nagłówek jest zakodowaną w JSON wiadomością zawierającą wystarczającą ilość informacji, aby potwierdzić fakt, że żądanie zostało zainicjowane przez klienta, który był podłączony do prawidłowego trzeciego systemu (nazwa użytkownika, klucz tajny itp.)

Status

Dokumentacja mówi nam, że powinniśmy być w stanie to zrobić ...

Jednak dokumentacja nie wyjaśnia, jak tworzyć takie komponenty i jak należy je konfigurować.

Debugowanie GeoServer Udało mi się znaleźć, że aby skonfigurować taki filtr, wymaga dedykowanego dostawcy uwierzytelniania. Żeby mieć panel w interfejsie administratora sieci (w ramach uwierzytelnień, na liście filtrów uwierzytelniania)

Płyta

Zatem mój kod składa się z tych plików:

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

Wymagają one dodania panelu w interfejsie administratora sieci. ProducteurAuthFilterPanelInfoprzykleja dwa pozostałe wraz z ProducteurAuthenticationFilterpóźniejszym ( filtr ^^).

ProducteurAuthenticationFilterConfigDeklaruje, że w jego konstruktora:

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

Filtruj (i dostawca)

Teraz klasy musiały stworzyć filtr, który ma zostać włączony do łańcucha (tak myślę):

  • ProducteurAuthenticationFilter : rozszerzenie GeoServerSecurityFilteri rozszerzenie implementacji filtraGeoServerAuthenticationFilter
  • ProducteurAnonymousAuthenticationProvider: jakoś wymagany przez Panel (powyżej) do zdefiniowania nowego filtra
  • ProducteurAuthenticationException: używany w AuthenticationEntryPoint (na razie tylko Http403ForbiddenEntryPoint)

Wreszcie fasole są zdefiniowane w następujący sposób:

<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>

Pod koniec gry, w interfejsie administratora sieci, mam nowy element w panelu filtrów i użyłem go w domyślnym odwzorowaniu (odnośniki znajdują się na obrazku poniżej): wprowadź opis zdjęcia tutaj

Opis problemu

Oto jesteśmy ...

Żadne z moich żądań WFS wydanych przez klienta (OpenLayers), które pasują do domyślnego mapowania (/ **), nie przechodzi przez zdefiniowany Filtr. Podczas debugowania odkryłem, że łańcuchy filtrów zdefiniowane w kontekście wiosennym nigdy nie uwzględniają mojej definicji, ale raczej zawsze obejmują klasyczny z użyciem anonimowego, streszczenia lub podstawowego ...

Pytanie

Czy ktoś jest w stanie wskazać mi (dużo ^^) pełniejszą dokumentację dotyczącą tego, jak mam to zrobić?

Andy Petrella
źródło

Odpowiedzi:

1

Robię to, implementując serwer proxy taki jak ten, który może zweryfikować poświadczenia użytkowników zalogowanych przy użyciu zmiennych sesji i pozwolić im tylko na dostęp do zasobów, do których są uprawnieni, tj .: sprawdzić adres URL dla wywoływanych warstw i odmówić dostępu, jeśli użytkownik nie jest upoważniony do ich przeglądania.

Jeśli chcesz ograniczyć użytkowników do określonego obszaru lub zestawu funkcji, istnieją dwa podejścia.

  1. Użyj sparametryzowanych widoków SQL, aby kontrolować, jakie dane zobaczy użytkownik. Możesz użyć Proxy do zmiany adresu URL przed przekazaniem go do Geoserver z parametrami specyficznymi dla tego użytkownika. Możesz również odesłać parametry z powrotem do Openlayers za pośrednictwem wywołania Ajax po uwierzytelnieniu użytkownika i podać parametry w ramach wywołania getMAP WMS w OpenLayers. Rzeczywiste wyświetlane dane mogą być obsługiwane przez zastępowanie zmiennych w SLD w celu filtrowania wyświetlanych danych lub za pomocą stylów zewnętrznych w wywołaniach getMap WMS w celu zmiany SLD używanej przez użytkownika do wyświetlenia danej warstwy.

  2. Użyj połączenia Ajax po uwierzytelnieniu użytkownika, aby określić zakresy map, aby umożliwić użytkownikowi przemieszczanie się tylko wokół określonego obszaru. Możesz także użyć layerVisibility (), aby ograniczyć również wyświetlanie danych.

Mark Cupitt
źródło