Le contexte
Dans mon projet actuel, j'ai l'obligation de valider que les demandes venant de GeoServer (2.3.0) sont autorisées.
Le projet contient ces faits:
- le client GS ne peut pas fournir les informations principales (le mot de passe par exemple), GS lui-même n'a pas de connexion avec un référentiel utilisateur / rôle
Nous en avons donc profité pour utiliser le mécanisme de filtrage d'authentification afin de vérifier que:
- une demande valide (vers une couche WFS spécifique) contient un en-tête HTTP spécial (disons X-CUSTOM-VALID)
- Cet en-tête est un message codé JSON contenant suffisamment d'informations pour valider le fait que la demande a été initiée par un client qui était connecté à un troisième système valide (un nom d'utilisateur, un secret, des trucs comme ça)
Statut
La documentation nous dit que nous devrions pouvoir le faire ...
Cependant, la documentation n'est pas claire comment créer de tels composants et comment ils doivent être configurés.
Débogage de GeoServer J'ai réussi à trouver que pour configurer un tel filtre, il fallait un fournisseur d'authentification dédié. Cela, afin d'avoir un panneau dans l'interface d'administration Web (sous authentifications, dans la liste des filtres d'authentification)
Panneau
Ainsi mon code est composé de ces fichiers:
- ProducteurAuthFilterPanel.java
- ProducteurAuthFilterPanelInfo.java
- ProducteurAuthenticationFilterConfig.java
- ProducteurAuthenticationFilterPanel.html
Ceux-ci sont nécessaires pour ajouter un panneau dans l'interface d'administration Web. ProducteurAuthFilterPanelInfo
colle les deux autres avec le ProducteurAuthenticationFilter
suivant (LE filtre ^^).
Le ProducteurAuthenticationFilterConfig
déclare que dans son constructeur:
setClassName(ProducteurAnonymousAuthenticationProvider.class.getName());
setName("producteur");
Filtre (et fournisseur)
Maintenant, les classes devaient créer un filtre à inclure dans une chaîne (je suppose):
- ProducteurAuthenticationFilter : l'implémentation du filtre s'étendant
GeoServerSecurityFilter
et implémentantGeoServerAuthenticationFilter
- ProducteurAnonymousAuthenticationProvider: requis par le Panel (ci-dessus) pour définir le nouveau filtre
- ProducteurAuthenticationException: utilisé dans AuthenticationEntryPoint (uniquement Http403ForbiddenEntryPoint pour l'instant)
Enfin, les beans sont définis comme suit:
<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>
À la fin du jeu, dans l'interface d'administration Web, j'ai un nouvel élément dans le panneau de filtrage et je l'ai utilisé dans le mappage par défaut (voir l'image ci-dessous pour les références):
Description du problème
Nous voilà...
Aucune de mes demandes WFS émises par un client (OpenLayers) qui correspondent au mappage par défaut (/ **) ne passe par le filtre défini. Lors du débogage, j'ai constaté que les chaînes de filtres définies dans le contexte de Spring n'incluaient jamais ma définition, mais incluaient toujours la classique utilisant anonymes, condensées ou basiques ...
Question
Alors, est-ce que quelqu'un peut me faire remarquer avec une documentation (beaucoup plus ^^) plus complète sur la façon dont je dois le faire?