Crie um filtro de autenticação personalizado no GeoServer 2.3.0

10

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. ProducteurAuthFilterPanelInfoestá colando os outros dois junto com o ProducteurAuthenticationFilteraqui-depois (O filtro ^^).

O ProducteurAuthenticationFilterConfigdeclara 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 GeoServerSecurityFiltere 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): insira a descrição da imagem aqui

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?

andy petrella
fonte

Respostas:

1

Eu faço isso implementando um Proxy como este que poderia verificar as credenciais de um usuário logado usando variáveis ​​de sessão e permitir apenas acessar recursos aos quais eles têm direito, ou seja: verificar o URL das camadas que estão sendo chamadas e negar acesso se o usuário não está autorizado a visualizá-los.

Se você deseja restringir os usuários a uma área ou conjunto de recursos em particular, existem duas abordagens.

  1. Use Exibições SQL parametrizadas para controlar quais dados o usuário visualizaria. Você pode usar o Proxy para alterar o URL antes que ele seja passado para o Geoserver com os parâmetros específicos para esse usuário. Você também pode enviar os parâmetros de volta aos Openlayers por meio de uma chamada Ajax após o usuário ser autenticado e fornecer os parâmetros como parte da chamada getMSAP do WMS no OpenLayers. Os dados reais exibidos podem ser manipulados pela substituição de Variável no SLD para filtrar os dados exibidos ou pelo uso de Estilos externos nas chamadas getMap do WMS para alterar o SLD que o usuário usa para exibir uma determinada camada.

  2. Use uma chamada Ajax após a autenticação do usuário para especificar as extensões de mapa para permitir apenas que o usuário se mova em torno de uma área especificada. Você também pode usar layerVisibility () para restringir quais dados também podem ser exibidos.

Mark Cupitt
fonte