Contexto
En mi proyecto actual, tengo el requisito de validar que las solicitudes que llegan a GeoServer (2.3.0) están permitidas.
El proyecto contiene esos hechos:
- el cliente GS no puede proporcionar la información principal (la contraseña, por ejemplo), el propio GS no tiene conexión con un repositorio de usuario / rol
Entonces aprovechamos la oportunidad de usar el mecanismo de filtro de autenticación para verificar que:
- una solicitud válida (a una capa WFS específica) contiene un encabezado HTTP especial (digamos X-CUSTOM-VALID)
- Este encabezado es un mensaje codificado JSON que contiene suficiente información para validar el hecho de que la solicitud fue iniciada por un cliente que estaba conectado a un tercer sistema válido (un nombre de usuario, un secreto, cosas así)
Estado
La documentación nos dice que deberíamos poder hacerlo ...
Sin embargo, la documentación no aclara cómo crear dichos componentes y cómo deberían configurarse.
Depuración de GeoServer Logré encontrar que para configurar dicho filtro, se requiere un proveedor de autenticación dedicado. Eso, para tener un panel en la interfaz de administración web (bajo autenticaciones, en la lista de Filtros de autenticación)
Panel
Por lo tanto, mi código se compone de esos archivos:
- ProducteurAuthFilterPanel.java
- ProducteurAuthFilterPanelInfo.java
- ProducteurAuthenticationFilterConfig.java
- ProducteurAuthenticationFilterPanel.html
Es necesario agregar un panel en la interfaz de administración web. ProducteurAuthFilterPanelInfo
está pegando los otros dos junto con el ProducteurAuthenticationFilter
aquí después (EL filtro ^^).
El ProducteurAuthenticationFilterConfig
declara que en su constructor:
setClassName(ProducteurAnonymousAuthenticationProvider.class.getName());
setName("producteur");
Filtro (y proveedor)
Ahora, las clases necesitaban crear un filtro para ser incluido en una cadena (supongo):
- ProducteurAuthenticationFilter : la implementación del filtro se extiende
GeoServerSecurityFilter
e implementaGeoServerAuthenticationFilter
- ProducteurAnonymousAuthenticationProvider: de alguna manera requerido por el Panel (arriba) para definir el nuevo filtro
- ProducteurAuthenticationException: utilizado en AuthenticationEntryPoint (solo Http403ForbiddenEntryPoint por ahora)
Finalmente, los beans se definen así:
<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>
Al final del juego, en la interfaz de administración web, tengo un nuevo elemento en el panel de filtro, y lo usé en la asignación predeterminada (consulte la imagen a continuación para obtener referencias):
Descripción del problema
Aquí estamos...
Ninguna de mis solicitudes WFS emitidas por un cliente (OpenLayers) que coinciden con la asignación predeterminada (/ **) pasa por el filtro definido. Durante la depuración descubrí que las cadenas de filtros definidas en el Contexto de primavera nunca incluyen mi definición, sino que siempre incluyen la clásica usando anónimo, resumen o básico ...
Pregunta
Entonces, ¿hay alguien capaz de señalarme con una (mucho ^^) documentación más completa sobre cómo tengo que hacerlo?