Contexto
No meu projeto atual, tenho o requisito de validar que as solicitações que chegam ao GeoServer (2.3.0) são permitidas.
O projeto contém esses fatos:
- o cliente GS não pode fornecer as informações principais (a senha, por exemplo), o próprio GS não tem conexão com um repositório de usuário / função
Então aproveitamos a oportunidade para usar o mecanismo de filtro de autenticação para verificar se:
- uma solicitação válida (para uma camada específica do WFS) contém um cabeçalho HTTP especial (digamos X-CUSTOM-VALID)
- Esse cabeçalho é uma mensagem codificada em JSON que contém informações suficientes para validar o fato de que a solicitação foi iniciada por um cliente conectado a um terceiro sistema válido (um nome de usuário, um segredo, coisas assim)
Status
A documentação está nos dizendo que deveríamos ser capazes de fazê-lo ...
No entanto, a documentação não está clara sobre como criar esses componentes e como eles devem ser configurados.
Depurando o GeoServer, consegui descobrir que, para configurar esse filtro, é necessário um provedor de autenticação dedicado. Que, para ter um painel na interface de administração da web (em autenticações, na lista Filtros de autenticação)
Painel
Assim, meu código é composto desses arquivos:
- ProducteurAuthFilterPanel.java
- ProducteurAuthFilterPanelInfo.java
- ProducteurAuthenticationFilterConfig.java
- ProducteurAuthenticationFilterPanel.html
É necessário adicionar um painel na interface do administrador da web. ProducteurAuthFilterPanelInfo
está colando os outros dois junto com o ProducteurAuthenticationFilter
aqui-depois (O filtro ^^).
O ProducteurAuthenticationFilterConfig
declara que em seu construtor:
setClassName(ProducteurAnonymousAuthenticationProvider.class.getName());
setName("producteur");
Filtro (e provedor)
Agora, as classes precisavam criar um filtro para ser incluído em uma cadeia (eu acho):
- ProducteurAuthenticationFilter : a implementação do filtro estendendo
GeoServerSecurityFilter
e implementandoGeoServerAuthenticationFilter
- ProducteurAnonymousAuthenticationProvider: de alguma forma exigido pelo Painel (acima) para definir o novo filtro
- ProducteurAuthenticationException: usado no AuthenticationEntryPoint (somente Http403ForbiddenEntryPoint por enquanto)
Finalmente, os beans são definidos da seguinte maneira:
<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>
No final do jogo, na Web Admin Interface, tenho um novo item no painel de filtros e o usei no mapeamento padrão (veja a imagem abaixo para obter referências):
Descrição do Problema
Aqui estamos...
Nenhuma das minhas solicitações WFS emitidas por um cliente (OpenLayers) que correspondem ao mapeamento padrão (/ **) passa pelo filtro definido. Durante a depuração, descobri que as cadeias de filtros definidas no Spring Contexto nunca incluem minha definição, mas sempre incluem a clássica usando anônimo, resumo ou básico ...
Questão
Então, alguém pode me indicar uma documentação (muito ^^) mais completa sobre como eu devo fazer isso?