WMS com controle de acesso (ACL) para diferentes usuários? Ou solução para milhares de pontos no mapa da web?


8

Eu tenho um conjunto de sites na casa dos milhares. Nem todos os usuários veem os mesmos sites no mapa - portanto, a ACL. Os dados são armazenados em um banco de dados não GIS (mssql, ora, etc) e agora são recuperados com uma consulta SQL padrão e retornados ao cliente (OpenLayers) com um JSP.

O código atual já está otimizado para fazer cluster do lado do cliente (menos bagunça no cliente, mas todos os dados estão lá), recuperação de caixa delimitadora (para um subconjunto de dados, mas é necessário ir ao servidor para todos os panorâmica / zoom para novos dados) e até cluster do lado do servidor (para reduzir os dados enviados ao cliente).

Em vez disso, gostaria de gerar imagens / blocos para todos os meus dados, semelhante à maneira como o Google Maps mostra toneladas de pequenos pontos vermelhos para todos os resultados - http://bit.ly/d73qrw [google maps search for "coffee"] e exibir no cliente. E quando clicado, faça uma chamada rápida ajax para um serviço WMS para obter informações. Essa é a ideia pelo menos.

Mas aqui está o problema - não posso simplesmente configurar um serviço WMS padrão na frente dos meus dados, porque nem todos os usuários veem os mesmos dados. Existe uma maneira de gerar esses blocos rapidamente ou tornar o WMS compatível com ACL?

edit - 22/09/2010 - Então eu descobri como o Google gera os blocos, ou melhor, a tecnologia por trás dele. Eles estão usando o Google Fusion Tables. Armazene N linhas em suas tabelas e, se os dados tiverem lat / lon, o produto Fusion Table poderá gerar os blocos rapidamente (!). Esse é o tipo de coisa que estou procurando - mapa de desempenho com toneladas de dados. Mas é claro que preciso que ele seja controlado pela ACL. Faz sentido escrever uma implementação leve e personalizada da especificação WMS ou modificar um produto existente? Embora o geoserver pareça muito "apenas" modificado para dar suporte à ACL.

edit - 27/09/2010 - Mais algumas informações desde a adição de recompensa. Meus dados estão no Oracle. Ora espacial não está ativado. No momento, os dados são extraídos no nível de negócios e convertidos em dados, enviados ao cliente onde o cliente coloca os "pontos" no mapa. A ACL é feita no nível da lógica de negócios, não no DB ou no ActivDir ou algo assim. A autenticação é simples, mas a Autorização não é e, portanto, teve que ser capturada no código. Gostaria de saber como criar melhor um serviço WMS para exibir milhares de "pontos" no mapa, onde cada usuário verá um subconjunto diferente de pontos. A resposta é um CQL_FILTER? Mas então como são definidos os parâmetros? Uma ideia que tenho agora é fazer um processo em duas etapas. Primeiro, execute a consulta interna para obter a lista de IDs que o usuário permitiu ver e, em seguida, crie uma string de solicitação WMS com esses IDs no parâmetro CQL_FILTER. Existe algo que simplifique esse processo? E se eu for com isso, como posso adicionar essa camada como uma camada "WMS" a um cliente Open Layers, já que para OL o ponto final é o meu código para obter IDs do DB e não o serviço WMS real, por exemplo, GeoServer?


@ lista de IDs em CQL_FILTER: Se esta lista ficar mais longa, o desempenho do Geoserver ficará muito ruim. Pelo menos é a minha experiência. Pergunta semelhante: gis.stackexchange.com/q/1654/187
underdark

Só quero dizer que lutamos com um problema muito semelhante e sou encorajado a ouvir outras pessoas falando sobre isso. Temos algumas idéias, mas cada uma tem suas próprias vantagens e desvantagens. Espero voltar a este tópico para contribuir e / ou aprender alguma coisa.
LarsH 01/10/10

Respostas:


3

2

Eu acho que uma solução comum é criar um script de proxy ou wrapper que fica entre o cliente e o WMS. O proxy é usado para criar uma chamada WMS personalizada com base nos parâmetros do cliente.

Você não mencionou se o seu objetivo para esta configuração é segurança ou apenas personalização, ou quais informações o cliente terá para determinar qual 'visualização' personalizada dos dados o WMS deve produzir.

Se você estiver exibindo mais do que algumas centenas de pontos, convém manter um serviço baseado em imagem como o WMS. Dependendo de seus requisitos, você também pode colocar o MapServer atrás de um script de wrapper que faz solicitações de mapa personalizadas com base em parâmetros exclusivos de filtro ou expressão.


David, o objetivo é a personalização. Segurança também, mas vamos assumir que isso foi resolvido. Mas o que o usuário vê depende de seus direitos de usuário. Então eles (1) acessam, (2) abrem o mapa e veem os Sites que têm permissão para ver. Você pode expandir mais a idéia do MapServer / GeoServer (eu sou Java) atrás de um wrapper que solicita com filtro. Você literalmente quer dizer o parâmetro "FILTER" ou "CQL_FILTER" ou algo mais? Venho pesquisando a opção CQL_FILTER desde que postei, mas não consegui testá-la em nenhum lugar on-line.
Vadim

2

Eu tenho uma resposta que funcionou para nós após algumas tentativas e erros.

O Oracle Spatial + Oracle VPD faz o truque. Já estamos usando o Ora e o VPD, então esse foi o próximo passo lógico. O Ora Spacial possui um serviço WMS e pode ser personalizado para ser diferente para diferentes usuários, com base em seus direitos / ACL via VPD. Se outras pessoas estão procurando algo assim, percebo que nem todas as operações têm ou podem pagar pelo Oracle, mas se você tiver, está lá. Não sei se o MS SQL Server tem funcionalidade semelhante.


1

Outra idéia (não tenho certeza se isso é realmente prático). O que você precisa é de um mapeamento entre permissões de usuário e arquivos de mapa gerados. Então, por que não criar um hash a partir da permissão do usuário e do mapa solicitado / estender? Esse hash é mapeado para um bloco gerado. Se o mapa não estiver lá, ele obviamente precisará ser gerado, caso contrário, poderá ser recuperado do cache do mapa. Obviamente, essa abordagem não traz benefícios se cada usuário vê um conjunto de dados completamente diferente. Mas se todos os usuários pertencerem a um grupo limitado de conjuntos de permissões, isso deve realmente ajudar.

Daniel


1

Qual é o seu prazo? Em Geomajas, já temos as limitações de segurança / acesso a dados. Estamos trabalhando em cache / rasterização neste momento, o que resultará no tipo de sistema que você está procurando. Deve terminar em algumas semanas.


hmmm. Eu estaria interessado em ouvir mais. Não temos pressa. Como mencionei acima (eu sei, há muito para ler), já temos uma solução de cluster de cliente + servidor funcionando. Mas gostaria de convertê-lo em uma solução baseada em blocos semelhante aos blocos do Google Maps com muitos pontos em um bloco. Como o seu produto se vincula a um modelo de segurança existente, mas personalizado? Não estamos no oAuth ou no Activ Dir ou algo assim.
Vadim


0

Provavelmente essa solução é louca, mas aqui vamos nós.

Por que não um servidor WMS por usuário? Vamos supor que estamos usando o MapServer. A configuração do MapServer é armazenada em um arquivo .map (também conhecido como mapfile), mas nada proíbe o uso de vários mapfiles. Quando uma solicitação WMS é feita, um dos parâmetros específicos do fornecedor que o MapServer aceita é 'map', que é uma string que contém o caminho e o nome do arquivo de arquivo de mapa usado [1]. Se nas solicitações do WMS for enviado um mapfile diferente, dependendo da identificação do usuário que efetuou login anteriormente, você obterá os servidores WMS como usuários e apenas com uma instalação do MapServer.

No lado da segurança, você teria que verificar o arquivo de mapa usado em relação a um ID de sessão, tarefa que provavelmente seria realizada por um proxy entre os clientes e o MapServer. Um usuário que queira ver os mapas de outros usuários poderá alterar manualmente o URL, alterando o parâmetro 'map', e essa contramedida de verificação tornaria essas tentativas sem êxito.

A contra (loucura) desta solução é para cada usuário que um arquivo de mapa deve ser gerado. Obviamente, caso o número de usuários seja alto, essa solução não é prática, a menos que os mapfiles possam ser gerados e atualizados automaticamente, quando necessário, usando um script ou mecanismo semelhante.

[1] Se você estiver usando o MapServer, o parâmetro 'map' é realmente obrigatório.


Aprecio a longa escrita, no entanto, a solução não é prática, pois o sistema possui muitos usuários que também podem ser adicionados ou removidos a qualquer momento e seus privilégios / filtros de visualização de dados alterados a qualquer momento por uma conta de administrador.
Vadim

0

Existem várias partes móveis aqui.

Primeiro, há a filtragem dos pontos: Isso deve ser feito no lado do servidor, imediatamente após ou durante sua consulta SQL.

Em seguida, os pontos filtrados precisam ser retornados ao cliente.

Essa é a parte simples. :) Eu recomendaria que você implementasse isso e depois testasse o desempenho e, idealmente, seria capaz de parar por aqui.

No entanto, se você tiver muitos pontos para exibir com eficiência no OpenLayers, obterá as otimizações que o Google parece fazer pelos pequenos pontos vermelhos:

  • Você precisa conectar um renderizador de blocos ao conjunto completo de resultados filtrados, produzindo blocos totalmente transparentes, exceto por um pequeno ponto por resultado. (Decisão do projeto: produza-os avidamente, ou somente sob demanda?)

    • O GeoServer, etc, exigirá código de 'gatilho', pois precisará de uma nova camada por consulta por usuário; À medida que você adiciona usuários, você precisa adicionar coisas novas para o GeoServer renderizar. (Além disso, você precisará produzir registros de resultados em um formato que possa ser consumido pela implementação da renderização). E com que frequência as peças antigas são renderizadas novamente?

    • Eu recomendaria um pequeno código de servidor que os proxies acessem o renderizador de blocos - dessa forma, alguém não poderá ver resultados que não são deles ao adivinhar um URL.

  • Em seguida, os resultados retornados ao navegador precisam ser particionados: Os primeiros n são resultados completos que recebem marcadores, enquanto o restante é enviado como coordenadas + URL de retorno de chamada. (Mesmo que não seja responsável por renderizá-los, o navegador precisa saber onde eles estão localizados para alterar o cursor, fornecer uma dica de ferramenta e realizar ações significativas com um clique!)

  • Depois, há o código JS no navegador para gerenciar interações com os pontos.

Até onde eu sei, que não é muito longe, ninguém escreveu o código "pronto para uso" para fazer o acima: Você está vendo vários códigos de integração de sistemas no back-end e algumas novas JS no a parte dianteira.


Obrigado Dan. Muita "comida caseira" é o que eu esperava, mas realmente queria saber se existe uma solução melhor ou mais elegante. Os blocos antigos devem ser renderizados com frequência, pois isso faz parte de um EMS e os dados são atualizados constantemente. Eu já tenho o cluster do cliente e do servidor ativado. E isso ajuda uma tonelada. Porque milhares de pontos se tornam apenas 30-40, onde a maioria deles são agrupamentos (que eu renderizo com um sinal de "mais"). Em um zoom / panorâmica, novos dados são carregados do servidor através da estratégia BoundingBox. Mas o agrupamento remove "desordem" do mapa. Então você perde o visual de quanta coisa existe.
Vadim

Esqueceu de adicionar. De certa forma, "desordem" é uma coisa boa. E não queremos representá-lo apenas com um círculo de tamanho variável (por exemplo, círculo grande para 50 pontos em cluster e pequeno para 10) porque, para o nosso caso de uso, ele não tem o mesmo significado que tem muitos pequenos pontos no mapa. suspiro :)
Vadim

Pessoalmente, detesto o agrupamento de pontos: remove uma enorme quantidade de informações e não tem uma boa interpretação. Então, eu estou lá com você. Além disso, se seus mapas estiverem em uma projeção simples como o típico mapa da Web Spherical Mercator: você pode considerar fazer a renderização do bloco. (Não há muito código para converter coordenadas lat / lon em pixel X / Y para um bloco; acho que você pode encontrar código no OpenStreetMap) --- isso vai livrar-se de grande parte da integração de sistemas, redirecionamento etc. trabalhos. (à custa de menos recursos, por exemplo, você não pode fazer os pontos como fantasia!)
Dan S.

0

Se você tiver uma consulta que possa ser executada para informar quais IDs um usuário pode ver (como você diz na edição mais recente), a "melhor" solução provavelmente será codificar esse filtro como um filtro CQL ou OGC como parte do Solicitação WMS. Você pode achar que é necessário reorganizar os dados em uma exibição para tornar isso possível.

Antes de começar a usar os Tile Caches, eu construía a versão simples e veria se ela era rápida o suficiente e depois tornava-se complexa se e somente se você precisar de mais velocidade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.