Crea un filtro di autenticazione personalizzato in GeoServer 2.3.0


10

Contesto

Nel mio progetto attuale, ho l'obbligo di convalidare che le richieste in arrivo su GeoServer (2.3.0) sono consentite.

Il progetto contiene questi fatti:

  • il client GS non può fornire le informazioni principali (ad esempio la password), GS stesso non ha alcuna connessione con un repo utente / ruolo

Quindi abbiamo colto l'occasione per utilizzare il meccanismo di filtro auth per verificare che:

  • una richiesta valida (a un livello WFS specifico) contiene un'intestazione HTTP speciale (diciamo X-CUSTOM-VALID)
  • Questa intestazione è un messaggio codificato JSON che contiene informazioni sufficienti per convalidare il fatto che la richiesta è stata avviata da un client che era collegato a un terzo sistema valido (un nome utente, un segreto, cose del genere)

Stato

La documentazione ci dice che dovremmo essere in grado di farlo ...

Tuttavia, la documentazione non è chiara su come creare tali componenti e su come configurarli.

Debugging GeoServer Sono riuscito a scoprire che per configurare un tale filtro, richiede un provider di autenticazione dedicato. Quello, per avere un pannello nell'interfaccia di amministrazione web (sotto autenticazioni, nell'elenco Filtri di autenticazione)

Pannello

Quindi il mio codice è composto da quei file:

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

Questi sono necessari per aggiungere un pannello nell'interfaccia di amministrazione Web. ProducteurAuthFilterPanelInfosta incollando gli altri due insieme al seguente ProducteurAuthenticationFilter(IL filtro ^^).

L' ProducteurAuthenticationFilterConfigdichiara che nel suo costruttore:

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

Filtro (e provider)

Ora, le classi necessarie per creare un filtro da includere in una catena (suppongo):

  • ProducteurAuthenticationFilter : l'implementazione del filtro si estende GeoServerSecurityFiltere si implementaGeoServerAuthenticationFilter
  • ProducteurAnonymousAuthenticationProvider: in qualche modo richiesto dal Pannello (sopra) per definire il nuovo filtro
  • ProducteurAuthenticationException: utilizzato in AuthenticationEntryPoint (solo Http403ForbiddenEntryPoint per ora)

Infine, i bean sono definiti in questo modo:

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

Alla fine del gioco, nell'interfaccia di amministrazione Web ho un nuovo oggetto nel pannello dei filtri e l'ho usato nella mappatura predefinita (vedi l'immagine sotto per i riferimenti): inserisci qui la descrizione dell'immagine

Descrizione del problema

Eccoci qui...

Nessuna delle mie richieste WFS emesse da un client (OpenLayers) che corrispondono alla mappatura predefinita (/ **) passa attraverso il filtro definito. Durante il debug ho scoperto che le catene di filtri definite nel contesto di primavera non includono mai la mia definizione, ma piuttosto includono sempre quella classica usando anonimo, digest o di base ...

Domanda

Quindi c'è qualcuno in grado di indicarmi con una (molto ^^) documentazione più completa su come devo farlo?

Risposte:


1

Lo faccio implementando un proxy come questo in grado di verificare le credenziali di un utente come effettuato l'accesso utilizzando le variabili di sessione e consentire loro solo di accedere alle risorse a cui hanno diritto, vale a dire: controllare l'URL per i livelli che vengono chiamati e negare l'accesso se l'utente non è autorizzato a visualizzarli.

Se si desidera limitare gli utenti a una determinata area o set di funzionalità, esistono due approcci.

  1. Utilizzare le viste SQL con parametri per controllare quali dati l'utente visualizzerebbe. È possibile utilizzare il proxy per modificare l'URL prima che venga passato a Geoserver con i parametri specifici per quell'utente. È inoltre possibile inviare i parametri a Openlayers tramite una chiamata Ajax dopo che l'utente è stato autenticato e fornire i parametri come parte della chiamata getMAP WMS in OpenLayers. I dati effettivi visualizzati potrebbero essere gestiti dalla sostituzione delle variabili in SLD per filtrare i dati visualizzati o utilizzando gli stili esterni nelle chiamate getMap WMS per modificare lo SLD utilizzato da un utente per visualizzare un determinato livello.

  2. Utilizzare una chiamata Ajax dopo l'autenticazione utente per specificare le estensioni della mappa per consentire all'utente di spostarsi solo attorno a un'area specificata. Puoi anche usare layerVisibility () per limitare anche i dati che possono essere visualizzati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.