¿WMS con control de acceso (ACL) para diferentes usuarios? ¿O una solución para miles de puntos en el mapa web?


8

Tengo un conjunto de sitios en los miles. No todos los usuarios ven los mismos Sitios en el mapa, por lo tanto, ACL. Los datos se almacenan en una base de datos no GIS (mssql, ora, etc.) y ahora se recuperan con una consulta SQL estándar y se devuelven al cliente (OpenLayers) con un JSP.

El código actual ya está optimizado para hacer clusters del lado del cliente (por lo que es menos desordenado para el cliente, pero todos los datos están ahí), recuperación del cuadro delimitador (por lo tanto, un subconjunto de datos pero tiene que ir al servidor para cada paneo / zoom para nuevos datos) e incluso clustering del lado del servidor (para reducir los datos enviados al cliente).

Lo que me gustaría en su lugar es generar imágenes / mosaicos para todos mis datos, de forma similar a cómo Google Maps muestra toneladas de pequeños puntos rojos para todos los resultados: http://bit.ly/d73qrw [búsqueda de Google Maps para "café"] y mostrar en el cliente. Y cuando haga clic en él, haga una llamada rápida ajax a un servicio WMS para obtener información. Esa es la idea al menos.

Pero aquí está el problema: no puedo configurar un servicio WMS estándar frente a mis datos porque no todos los usuarios ven los mismos datos. ¿Hay alguna manera de generar estos mosaicos sobre la marcha o hacer que WMS sea compatible con ACL?

edit - 9/22/2010 - Entonces descubrí cómo google genera los mosaicos, o más bien la tecnología detrás de ellos. Están utilizando las tablas de Google Fusion. Almacene N filas en sus tablas y luego, si los datos tienen conocimiento de lat / lon, el producto Fusion Table puede generar los mosaicos sobre la marcha (!). Este es el tipo de cosas que estoy buscando: un mapa eficaz con toneladas de datos. Pero, por supuesto, necesito que sea controlado por ACL. ¿Tiene sentido escribir una implementación ligera y personalizada de la especificación WMS o modificar un producto existente? Aunque geoserver parece mucho "simplemente" modificar para admitir ACL.

edit - 9/27/2010 - Alguna información más desde la adición de la recompensa. Mis datos están en Oracle. Ora espacial no está habilitado. En este momento, los datos se extraen a nivel empresarial y se convierten en datos, enviados al cliente donde el cliente coloca los "puntos" en el mapa. ACL se realiza en el nivel de lógica de negocios, no DB o ActivDir o algo así. La autenticación es simple, pero la Autorización no lo es, por lo que tuvo que ser capturada en el código. Me gustaría saber cómo crear mejor un servicio WMS para servir hasta miles de "puntos" en el mapa donde cada usuario verá un subconjunto diferente de puntos. ¿Es la respuesta un CQL_FILTER? Pero entonces, ¿cómo se configuran los parámetros? Una idea que tengo ahora es hacer un proceso de 2 pasos. Primero ejecute la consulta interna para obtener una lista de ID que el usuario permitió ver, luego cree una cadena de solicitud WMS con esas ID en el parámetro CQL_FILTER. ¿Hay algo que simplifique este proceso? Y si sigo con esto, ¿cómo puedo agregar esta capa como una capa "WMS" a un cliente Open Layers ya que para OL el punto final es mi código para obtener ID de DB y no del servicio WMS real en, por ejemplo, GeoServer?


@lista de ID en CQL_FILTER: si esta lista se alarga, el rendimiento de Geoserver será realmente pobre. Al menos esa es mi experiencia. Pregunta similar: gis.stackexchange.com/q/1654/187
underdark

Solo quiero decir que hemos luchado con un problema muy similar, y me alienta escuchar a otros hablar sobre eso. Tenemos algunas ideas pero cada una tiene sus propias compensaciones. Espero volver a este hilo para contribuir y / o aprender algo.
LarsH

Respuestas:


3

2

Creo que una solución común es crear una secuencia de comandos proxy o wrapper que se encuentre entre el cliente y WMS. El proxy se utiliza para crear una llamada WMS personalizada basada en parámetros del cliente.

No ha mencionado si su propósito para esta configuración es la seguridad o solo la personalización, o qué información tendrá el cliente para determinar qué 'vista' personalizada de los datos debe producir el WMS.

Si va a mostrar más de unos pocos cientos de puntos, querrá atenerse a un servicio basado en imágenes como WMS. Dependiendo de sus requisitos, también podría simplemente colocar MapServer detrás de un script de envoltura que realiza solicitudes de mapas personalizadas basadas en filtros únicos o parámetros de expresión.


David, el propósito es la personalización. Seguridad también, pero supongamos que ya se ha solucionado. Pero lo que ve el usuario depende de sus derechos de usuario. Entonces (1) inician sesión, (2) abren el mapa y luego ven los Sitios que tienen permitido ver. ¿Puede ampliar más la idea de MapServer / GeoServer (soy un chico de Java) detrás de un contenedor que solicita con filtro. ¿Te refieres literalmente al parámetro "FILTER" o "CQL_FILTER" o algo más? He estado investigando la opción CQL_FILTER desde que publiqué, pero no he podido probarla en ningún lugar en línea.
Vadim

2

Tengo una respuesta que funcionó para nosotros después de algunas pruebas y errores.

Oracle Spatial + Oracle VPD hace el truco. Ya estamos usando Ora y VPD, por lo que este fue el siguiente paso lógico. Ora Space tiene un servicio WMS y se puede personalizar para que sea diferente para diferentes usuarios en función de sus derechos / ACL a través de VPD. Si otros buscan algo como esto, me doy cuenta de que no todas las operaciones tienen o pueden permitirse Oracle, pero si lo tienen, está ahí. No sé si MS SQL Server tiene una funcionalidad similar.


1

Otra idea (no estoy seguro si esto es realmente práctico). Lo que necesita es una asignación entre los permisos de usuario y los archivos de mapas generados. Entonces, ¿por qué no crear un hash a partir del permiso del usuario y el mosaico / extensión del mapa solicitado? Este hash se asigna a un mosaico generado. Si el mapa no está allí, obviamente debe generarse, de lo contrario, puede recuperarse de la caché del mapa. Por supuesto, este enfoque no trae ningún beneficio si cada usuario ve un conjunto de datos completamente diferente. Pero si todos los usuarios pertenecen a un grupo limitado de conjuntos de permisos, esto realmente debería ayudar.

Daniel


1

¿Cuál es tu fecha límite? En Geomajas, ya tenemos las limitaciones de seguridad / acceso a datos. Estamos trabajando en el almacenamiento en caché / rasterización en este momento, lo que dará como resultado el tipo de sistema que está buscando. Debería estar terminado en un par de semanas.


hmmm Me interesaría saber más. No tenemos prisa. Como mencioné anteriormente (lo sé, hay mucho para leer) ya tenemos una solución de clúster cliente + servidor funcionando. Pero me gustaría convertirlo en una solución basada en mosaicos similar a los mosaicos de Google Maps con muchos puntos en un mosaico. ¿Cómo se vincula su producto con un modelo de seguridad existente pero personalizado? No estamos en oAuth o Activ Dir o de esa manera.
Vadim


0

Probablemente esta solución es una locura, pero aquí vamos.

¿Por qué no un servidor WMS por usuario? Supongamos que estamos usando MapServer. La configuración de MapServer se almacena en un archivo .map (también conocido como mapfile), pero nada prohíbe usar varios mapfiles. Cuando se realiza una solicitud WMS, uno de los parámetros específicos del proveedor que MapServer aceptará es 'map', que es una cadena que contiene la ruta y el nombre de archivo del mapfile utilizado [1]. Si en sus solicitudes WMS se envía un archivo de mapa diferente dependiendo de la identificación del usuario que inició sesión anteriormente, obtendrá los servidores WMS como usuarios, y solo con una instalación de MapServer.

En el lado de la seguridad, tendría que verificar el archivo de mapas usado contra una identificación de sesión, tarea que probablemente sería realizada por un proxy entre clientes y MapServer. Un usuario que desee ver los mapas de otros usuarios podría alterar manualmente la URL cambiando el parámetro 'mapa', y esta contramedida de verificación haría que tales intentos no tuvieran éxito.

La contra (locura) de esta solución es que para cada usuario se debe generar un archivo de mapa. Obviamente, en caso de que el número de usuarios sea alto, esta solución no es práctica, a menos que los archivos de mapas se puedan generar y actualizar automáticamente, cuando sea necesario, mediante el uso de un script o mecanismo similar.

[1] Si usa MapServer, el parámetro 'map' es realmente obligatorio.


Agradezco la larga redacción, sin embargo, la solución no es práctica ya que el sistema tiene muchos usuarios que también pueden agregarse o eliminarse en cualquier momento y sus privilegios / filtros de visualización de datos también pueden cambiarse en cualquier momento por una cuenta de administrador.
Vadim

0

Hay varias partes móviles aquí.

Primero, hay que filtrar los puntos: esto debe hacerse en el lado del servidor, inmediatamente después o durante su consulta SQL.

Luego, los puntos filtrados deben devolverse al cliente.

Esa es la parte simple. :) Recomiendo que implemente esto y luego pruebe el rendimiento, e idealmente podría detenerse aquí.

Sin embargo, si tiene demasiados puntos para mostrar de manera eficiente en OpenLayers, entonces obtiene las optimizaciones que Google parece hacer para los pequeños puntos rojos:

  • Debe conectar un renderizador de mosaico al conjunto completo de resultados filtrados, produciendo mosaicos completamente transparentes, excepto por un pequeño punto por resultado. (Decisión de diseño: ¿producir estos con entusiasmo o solo bajo demanda?)

    • GeoServer, etc., requerirá un código 'disparador' ya que necesitarán una nueva capa por consulta por usuario; a medida que agrega usuarios, deberá agregar cosas nuevas para que GeoServer las represente. (Además, deberá producir registros de resultados en un formato que pueda ser consumido por la implementación de representación). ¿Y con qué frecuencia se vuelven a representar los mosaicos antiguos?

    • Recomendaría una pequeña porción de código de servidor que representa el acceso al renderizador de teselas, de esa manera alguien no podrá ver resultados que no son suyos al adivinar una URL.

  • A continuación, los resultados que se devuelven al navegador deben dividirse: los primeros n son resultados completos que colocan marcadores, mientras que el resto se envía como coordenadas + URL de devolución de llamada. (¡Incluso si no se encarga de representarlos, el navegador necesita saber dónde están ubicados para cambiar el cursor, proporcionar información sobre herramientas y realizar acciones significativas con un clic!)

  • Luego está el código JS en el navegador para administrar las interacciones con los puntos.

Hasta donde yo sé, que no está muy lejos, nadie ha escrito el código 'listo para usar' para hacer lo anterior: estás viendo un montón de código de integración de sistemas en el backend y un poco de JS nuevo en el Interfaz.


Gracias Dan. Mucha de la "cocina casera" es lo que esperaba, pero realmente quería saber si hay una solución mejor o más elegante. Los mosaicos antiguos deben volver a representarse con frecuencia, ya que esto forma parte de un EMS y los datos se actualizan constantemente. Ya tengo habilitado el clúster del lado del cliente y del servidor. Y ayuda mucho. Debido a que miles de puntos se convierten en 30-40, donde la mayoría de ellos son grupos (que renderizo con un signo "más"). En un zoom / pan se cargan nuevos datos del servidor a través de la estrategia BoundingBox. Pero la agrupación elimina el "desorden" del mapa. Entonces pierdes la visión de la cantidad de cosas que hay.
Vadim

Olvidé agregar En cierto modo, "desorden" es algo bueno. Y no queremos representarlo solo con un círculo de tamaño variable (por ejemplo, un círculo grande para 50 puntos en el grupo y uno pequeño para 10) porque para nuestro caso de uso no tiene el mismo significado que tener muchos puntos pequeños en el mapa. suspiro :)
Vadim

Personalmente, desprecio la agrupación de puntos: elimina una gran cantidad de información y no tiene una buena interpretación en absoluto. Entonces estoy ahí contigo. Además, si sus mapas están en una proyección simple como el típico mapa web Spherical Mercator: puede considerar hacer el mosaico usted mismo. (No es mucho código convertir lat / lon en coordenadas X / Y de píxeles para un mosaico; creo que puedes encontrar código en OpenStreetMap) --- eso eliminará gran parte de la integración de sistemas, redireccionamiento, etc. trabajo. (¡a expensas de menos funciones, por ejemplo, no puedes hacer los puntos tan elegantes!)
Dan S.

0

Si tiene una consulta que se puede ejecutar para indicarle qué ID puede ver un usuario (como usted dice en la última edición), entonces la "mejor" solución será codificar ese filtro como un filtro CQL u OGC como parte del Solicitud de WMS. Es posible que sea necesario reorganizar los datos en una vista para que esto sea factible.

Antes de comenzar a usar Tile Caches, construiría la versión simple y vería si es lo suficientemente rápida, y luego me volveré complejo si y solo si necesita más velocidad.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.