Suite

WMS avec contrôle d'accès (ACL) pour différents utilisateurs ? Ou une solution pour des milliers de points sur une carte Web ?

WMS avec contrôle d'accès (ACL) pour différents utilisateurs ? Ou une solution pour des milliers de points sur une carte Web ?


J'ai un ensemble de sites par milliers. Tous les utilisateurs ne voient pas les mêmes sites sur la carte - donc ACL. Les données sont stockées dans une base de données non SIG (mssql, ora, etc.) et sont actuellement récupérées avec une requête SQL standard et renvoyées au client (OpenLayers) avec une JSP.

Le code actuel est déjà optimisé pour faire du clustering côté client (donc moins de gâchis sur le client, mais toutes les données sont là), la récupération de la zone de délimitation (donc un sous-ensemble de données mais doit aller au serveur pour chaque panoramique/zoom pour les nouvelles données) et même le clustering côté serveur (pour réduire les données envoyées au client).

Ce que je voudrais à la place, c'est générer des images/tuiles pour toutes mes données, de la même manière que Google Maps affiche des tonnes de petits points rouges pour tous les résultats - http://bit.ly/d73qrw [google maps recherche "café"] et afficher sur le client. Et lorsque vous cliquez dessus, effectuez un appel ajax rapide à un service WMS pour obtenir des informations. C'est du moins l'idée.

Mais voici le problème - je ne peux pas simplement configurer un service WMS standard devant mes données car tous les utilisateurs ne voient pas les mêmes données. Existe-t-il un moyen de générer ces tuiles à la volée ou de prendre en charge WMS ACL ?

edit - 22/09/2010 - J'ai donc découvert comment google génère les tuiles, ou plutôt la technologie qui se cache derrière. Ils utilisent Google Fusion Tables. Stockez N lignes dans leurs tables, puis si les données sont conscientes de la latitude et de la longitude, le produit Fusion Table peut générer les tuiles à la volée (!). C'est le genre de chose que je recherche - une carte performante avec des tonnes de données. Mais bien sûr, j'ai besoin qu'il soit contrôlé par l'ACL. Est-il judicieux d'écrire une implémentation légère personnalisée de la spécification WMS ou de modifier un produit existant ? Bien que le géoserveur semble beaucoup à "simplement" modifier pour prendre en charge ACL.

edit - 9/27/2010 - Quelques informations supplémentaires depuis l'ajout de la prime. Mes données sont dans Oracle. Ora spatial n'est pas activé. À l'heure actuelle, les données sont extraites au niveau de l'entreprise et converties en données, envoyées au client où le client place les "points" sur la carte. ACL est fait au niveau de la logique métier, pas DB ou ActivDir ou quelque chose comme ça. L'authentification est simple, mais l'autorisation ne l'est pas et devait donc être capturée dans le code. J'aimerais savoir comment créer au mieux un service WMS pour servir des milliers de "points" sur la carte où chaque utilisateur verra un sous-ensemble différent de points. La réponse est-elle un CQL_FILTER ? Mais alors comment sont réglés les paramètres ? Une idée que j'ai maintenant est de faire un processus en 2 étapes. Exécutez d'abord une requête interne pour obtenir la liste des identifiants que l'utilisateur est autorisé à voir, puis créez une chaîne de requête WMS avec ces identifiants dans le paramètre CQL_FILTER. Y a-t-il quelque chose qui simplifie ce processus? Et si je vais avec cela, comment puis-je ajouter cette couche en tant que couche "WMS" à un client Open Layers puisque pour OL, le point de terminaison est mon code pour obtenir les identifiants de la base de données et non du service WMS réel, par exemple. GéoServeur ?


Quelques projets pour les webservices SIG ACL

  • http://52north.org/maven/project-sites/52n-security-site/
  • http://www.geoxacml.org/
  • https://secureows.org/
  • http://www.easysdi.org/
  • http://istgeo.ist.supsi.ch/site/projects/geoshield
  • http://wald.intevation.org/scm/?group_id=39 (Gispatcher)
  • http://www.mapbender.org/OWS_Proxy (pour Mapbender)
  • http://wiki.deegree.org/deegreeWiki/iGeoSecurity (pour le diplôme)

Au foss4g 2010, voir le 09 sept 11h00 dans le programme final http://2010.foss4g.org/program_print.php (présentations non disponibles pour le moment)


Je pense qu'une solution courante consiste à créer un script proxy ou wrapper qui se situe entre le client et WMS. Le proxy est utilisé pour créer un appel WMS personnalisé en fonction des paramètres du client.

Vous n'avez pas indiqué si votre objectif pour cette configuration est la sécurité ou simplement la personnalisation, ou quelles informations le client devra déterminer quelle « vue » personnalisée des données que le WMS doit produire.

Si vous affichez plus de quelques centaines de points, vous voudrez vous en tenir à un service basé sur des images comme WMS. Selon vos besoins, vous pouvez également simplement placer MapServer derrière un script wrapper qui effectue des demandes de carte personnalisées en fonction de paramètres de filtre ou d'expression uniques.


J'ai une réponse qui a fonctionné pour nous après quelques essais et erreurs.

Oracle Spatial + Oracle VPD fait l'affaire. Nous utilisons déjà Ora et VPD, c'était donc la prochaine étape logique. Ora spatial dispose d'un service WMS et peut être personnalisé pour être différent pour différents utilisateurs en fonction de leurs droits/ACL via VPD. Si d'autres recherchent quelque chose comme ça, je me rends compte que toutes les opérations n'ont pas ou ne peuvent pas se permettre Oracle, mais si vous l'avez, c'est là-dedans. Je ne sais pas si MS SQL Server a des fonctionnalités similaires.


Une autre idée (je ne sais pas si c'est vraiment pratique). Ce dont vous avez besoin, c'est d'un mappage entre les autorisations utilisateur et les fichiers de carte générés. Alors, pourquoi ne pas créer un hachage à partir de l'autorisation de l'utilisateur et de la tuile/extension de carte demandée ? Ce hachage correspond à une tuile générée. Si la carte n'est pas là, elle doit évidemment être générée, sinon elle peut être récupérée dans le cache de la carte. Bien sûr, cette approche n'apporte aucun avantage si chaque utilisateur voit un ensemble de données complètement différent. Mais si tous les utilisateurs appartiennent à un groupe limité d'ensembles d'autorisations, cela devrait vraiment aider.

Daniel


Quelle est votre date limite ? Dans Geomajas, nous avons déjà les limitations de sécurité / accès aux données. Nous travaillons actuellement sur la mise en cache/la rastérisation, ce qui donnera le type de système que vous recherchez. Il devrait être terminé dans quelques semaines.


Un Web Feature Service (WFS) serait-il plus efficace ?

http://openlayers.org/dev/examples/getfeatureinfo-popup.html

Juste une idée.


Cette solution est probablement folle, mais c'est parti.

Pourquoi pas un serveur WMS par utilisateur ? Supposons que nous utilisions MapServer. La configuration de MapServer est stockée dans un fichier .map (alias mapfile), mais rien n'interdit d'utiliser plusieurs mapfiles. Lorsqu'une requête WMS est effectuée, l'un des paramètres spécifiques au fournisseur que MapServer accepte est 'map', qui est une chaîne contenant le chemin et le nom de fichier du mapfile utilisé[1]. Si dans vos requêtes WMS un mapfile différent est envoyé en fonction de l'identifiant de l'utilisateur qui s'est précédemment connecté, alors vous obtiendrez des serveurs WMS en tant qu'utilisateurs, et uniquement avec une installation de MapServer.

Du côté de la sécurité, vous devrez vérifier le mapfile utilisé par rapport à un identifiant de session, tâche qui serait probablement effectuée par un proxy entre les clients et MapServer. Un utilisateur souhaitant voir les cartes d'autres utilisateurs pourrait modifier manuellement l'URL en changeant le paramètre 'map', et cette contre-mesure de vérification rendrait ces tentatives infructueuses.

Le contra (folie) de cette solution est pour chaque utilisateur un mapfile doit être généré. Évidemment, dans le cas où le nombre d'utilisateurs est élevé, cette solution n'est pas pratique, à moins que les mapfiles puissent être automatiquement générés et mis à jour, si nécessaire, en utilisant un script ou un mécanisme similaire.

[1] Si vous utilisez MapServer, le paramètre 'map' est en fait obligatoire.


Il y a plusieurs pièces mobiles ici.

Tout d'abord, il y a le filtrage des points : Cela doit être fait côté serveur, immédiatement après ou pendant votre requête SQL.

Ensuite, les points filtrés doivent être renvoyés au client.

C'est la partie simple. :) Je vous recommanderais de mettre en œuvre cela, puis de tester les performances, et idéalement, je pourrais vous arrêter ici.

Cependant, si vous avez trop de points à afficher efficacement dans OpenLayers, vous accédez à la ou aux optimisations que Google semble faire pour les petits points rouges :

  • Vous devez connecter un moteur de rendu de tuiles à l'ensemble complet des résultats filtrés, produisant des tuiles entièrement transparentes à l'exception d'un petit point par résultat. (Décision de conception : les produire avec empressement, ou uniquement à la demande ?)

    • GeoServer, etc., nécessitera un code de "déclenchement" car ils auront besoin d'une nouvelle couche par requête et par utilisateur ; au fur et à mesure que vous ajoutez des utilisateurs, vous devrez ajouter de nouvelles choses pour que GeoServer les rende. (En outre, vous devrez produire des enregistrements de résultats dans un format pouvant être utilisé par l'implémentation de rendu). Et à quelle fréquence les vieilles tuiles sont-elles re-enduites ?

    • Je recommanderais un petit code de serveur qui donne un accès proxy au moteur de rendu de tuiles - de cette façon, quelqu'un ne pourra pas voir des résultats qui ne sont pas les siens en devinant une URL.

  • Ensuite, les résultats renvoyés au navigateur doivent être partitionnés : le premier m sont des résultats complets qui obtiennent des marqueurs placés, tandis que le reste est envoyé sous forme de coordonnées + URL de rappel. (Même s'il n'est pas chargé de les afficher, le navigateur a besoin de savoir où ils se trouvent afin de modifier le curseur, de fournir une info-bulle et d'effectuer une action significative en un clic !)

  • Ensuite, il y a le code JS dans le navigateur pour gérer les interactions avec les points.

Pour autant que je sache, ce qui n'est pas très loin, personne n'a écrit de code prêt à l'emploi pour faire ce qui précède : vous regardez un tas de code d'intégration de systèmes sur le backend et pas mal de nouveau JS sur le l'extrémité avant.


Si vous avez une requête qui peut être exécutée pour vous dire quels identifiants un utilisateur peut voir (comme vous l'avez dit dans la dernière modification), alors la "meilleure" solution sera probablement d'encoder ce filtre en tant que filtre CQL ou OGC dans le cadre du demande WMS. Vous constaterez peut-être que la réorganisation des données dans une vue est nécessaire pour rendre cela possible.

Avant de commencer à utiliser Tile Caches, je créerais la version simple et verrais si elle est assez rapide, puis je deviendrais complexe si et seulement si vous avez besoin de plus de vitesse.