さまざまなユーザーのアクセス制御(ACL)を備えたWMS?またはWebマップ上の何千ものポイントの解決策?


8

私は何千ものサイトのセットを持っています。すべてのユーザーがマップ上で同じサイトを見るとは限りません-したがってACL。データは非GISデータベース(mssql、oraなど)に格納され、現在標準のSQLクエリで取得され、JSPを使用してクライアント(OpenLayers)に返されます。

現在のコードはすでにクライアント側のクラスタリング(クライアントの混乱は少ないですが、すべてのデータはそこにあります)、境界ボックスの取得(データのサブセットですが、すべてのサーバーにアクセスする必要がある)を実行するようにすでに最適化されています新しいデータのパン/ズーム)およびサーバー側のクラスタリング(クライアントに送信されるデータを減らすため)。

代わりに、すべてのデータに対して画像/タイルを生成します。これは、Googleマップがすべての結果に対して大量の小さな赤い点を表示する方法と似ています-http://bit.ly/d73qrw [google maps search for "coffee"]クライアントに表示します。クリックすると、情報を取得するためにWMSサービスをすばやくajaxで呼び出します。それは少なくともアイデアです。

しかし、ここに問題があります。すべてのユーザーが同じデータを表示するわけではないため、データの前に標準のWMSサービスをセットアップすることはできません。これらのタイルをオンザフライで生成したり、WMSをACL対応にする方法はありますか?

編集-2010年9月22日-Googleがタイルを生成する方法、またはその背後にあるテクノロジーを見つけました。彼らはGoogle Fusion Tablesを使用しています。テーブルにN行を格納し、データが緯度/経度を認識している場合、Fusion Table製品はその場でタイルを生成できます(!)。これは私が探している種類のものです-大量のデータを含む高性能のマップ。しかしもちろん、ACLで制御する必要があります。WMS仕様のカスタムの軽量実装を記述したり、既存の製品を変更したりすることには意味がありますか?geoserverは、ACLをサポートするために「ただ」変更するだけのように思えます。

編集-2010年9月27日-バウンティを追加してからの詳細情報。私のデータはOracleにあります。Ora空間が有効になっていません。現在、データはビジネスレベルで抽出されてデータに変換され、クライアントに送信されます。クライアントは「ドット」をマップに配置します。ACLは、DBやActivDirなどではなく、ビジネスロジックレベルで実行されます。認証は単純ですが、承認は単純ではないため、コードに取り込む必要がありました。各ユーザーに異なるドットのサブセットが表示されるマップ上で最大数千の「ドット」を提供するWMSサービスを最適に作成する方法を知りたい。答えはCQL_FILTERですか?しかし、パラメーターはどのように設定されますか?私が今持っている考えの1つは、2ステップのプロセスを実行することです。最初に社内クエリを実行して、ユーザーが表示を許可されているIDのリストを取得し、次に、CQL_FILTERパラメーターでそれらのIDを使用してWMSリクエスト文字列を作成します。このプロセスを簡略化するものはありますか?そして、これを使用する場合、エンドポイントをOLにするには、GeoServer上の実際のWMSサービスではなくDBからIDを取得するためのコードなので、このレイヤーを「WMS」レイヤーとしてOpen Layersクライアントに追加するにはどうすればよいですか?


@CQL_FILTER内のIDのリスト:このリストが長くなると、Geoserverのパフォーマンスが非常に低下します。少なくともそれは私の経験です。同様の質問:gis.stackexchange.com/q/1654/187
アンダーダーク

ただ言いたいのですが、私たちは非常に類似した問題に取り組んできました。他の人がそれについて話しているのを聞いてください。アイデアはいくつかありますが、それぞれに独自のトレードオフがあります。このスレッドに戻って貢献したり、何かを学んだりしたい
LarsH

回答:


3

GIS WebサービスACLのいくつかのプロジェクト

foss4g 2010では、9月9日11:00に最終プログラムhttp://2010.foss4g.org/program_print.phpをご覧ください(現時点ではプレゼンテーションはご利用いただけません)


2

一般的な解決策は、クライアントとWMSの間に配置するプロキシまたはラッパースクリプトを作成することだと思います。プロキシは、クライアントからのパラメーターに基づいてカスタムWMS呼び出しを作成するために使用されます。

このセットアップの目的がセキュリティであるか、単にカスタマイズであるか、またはクライアントがWMSが生成する必要のあるデータのカスタム「ビュー」を決定するために必要な情報については言及していません。

数百以上のポイントを表示する場合は、WMSのような画像ベースのサービスを使い続ける必要があります。要件に応じて、一意のフィルターまたは式パラメーターに基づいてカスタムマップ要求を行うラッパースクリプトの背後にMapServerを置くこともできます。


David、目的はカスタマイズです。セキュリティもそうですが、大事にされているとしましょう。ただし、ユーザーに表示される内容は、ユーザーの権限によって異なります。つまり、(1)ログインし、(2)マップを開いて、閲覧を許可されているサイトを閲覧します。フィルターを使用して要求するラッパーの背後にあるMapServer / GeoServer(私はJavaの男です)のアイデアをさらに拡張できますか?文字通り、「FILTER」または「CQL_FILTER」パラメータを意味するのでしょうか?投稿してからCQL_FILTERオプションを調査してきましたが、オンラインでどこでもテストすることはできませんでした。
ヴァディム2010

2

試行錯誤を繰り返した結果、うまくいった答えがあります。

Oracle Spatial + Oracle VPDがうまく機能します。私たちはすでにOraとVPDを使用しているので、これは次の論理的なステップでした。Ora SpatialにはWMSサービスがあり、VPDを介した権限/ ACLに基づいて、ユーザーごとに異なるようにカスタマイズできます。他の人がこのようなものを探しているなら、すべてのオペレーションがOracleを持っている、または買う余裕があるわけではないことに気づきます。MS SQL Serverに同様の機能があるかどうかはわかりません。


1

別のアイデア(これが本当に実用的かどうかはわかりません)。必要なのは、ユーザー権限と生成されたマップファイル間のマッピングです。それでは、ユーザー権限とマップタイル/拡張を要求してハッシュを作成してみませんか?このハッシュは、生成されたタイルにマッピングされます。マップが存在しない場合は、明らかに生成する必要があります。それ以外の場合は、マップキャッシュから取得できます。もちろん、このアプローチは、各ユーザーが完全に異なるデータのセットを見る場合、何の利点ももたらしません。しかし、すべてのユーザーが許可セットの限られたグループに属している場合、これは本当に役立ちます。

ダニエル


1

あなたの締め切りは何ですか?Geomajasでは、セキュリティ/データアクセスの制限がすでにあります。現在、キャッシング/ラスタライズに取り組んでおり、お客様が探しているようなシステムが実現します。数週間で完成するはずです。


うーん。もっと聞きたいです。私たちは急いでいません。上で述べたように(知っていることはたくさんあります)、既にクライアント+サーバークラスタリングソリューションが機能しています。しかし、私はそれを、タイルにたくさんのドットがあるグーグルマップタイルに似たタイルベースのソリューションに変換したいと思います。製品を既存のカスタムセキュリティモデルにどのように結び付けますか?私たちはoAuthやActiv Dirなどを利用していません。
ヴァディム


0

おそらくこのソリューションはおかしいですが、ここに行きます

ユーザーごとにWMSサーバーがないのはなぜですか?MapServerを使用しているとしましょう。MapServer構成は.mapファイル(別名mapfile)に格納されますが、複数のmapfileの使用を禁止するものはありません。WMSリクエストが完了すると、MapServerが受け入れるベンダー固有のパラメータの1つは「map」です。これは、使用されるmapfile [1]のパスとファイル名を含む文字列です。WMSリクエストで、以前にログインしたユーザーのIDに応じて異なるmapfileが送信された場合、ユーザーとしてWMSサーバーとして取得され、MapServerが1回インストールされているだけです。

セキュリティの面では、使用されたマップファイルをセッションIDに対してチェックする必要があります。このタスクは、クライアントとMapServer間のプロキシによって実行される可能性があります。他のユーザーのマップを表示したいユーザーは、「map」パラメーターを変更してURLを手動で変更する可能性があり、このチェック対策では、このような試みは失敗します。

このソリューションの反対(クレイジーさ)は、すべてのユーザーに対してマップファイルを生成する必要があることです。明らかに、ユーザー数が多い場合、スクリプトまたは同様のメカニズムを使用してマップファイルを必要に応じて自動的に生成および更新できない限り、このソリューションは実用的ではありません。

[1] MapServerを使用する場合、「map」パラメーターは実際には必須です。


長い説明に感謝しますが、システムには多くのユーザーがいつでも追加または削除でき、そのデータ表示特権/フィルターは管理者アカウントでもいつでも変更できるため、このソリューションは実用的ではありません。
ヴァディム

0

ここにはいくつかの可動部分があります。

まず、ポイントをフィルタリングします。これは、SQLクエリの直後または最中にサーバー側で行う必要があります。

次に、フィルタリングされたポイントをクライアントに返す必要があります。

それは簡単な部分です。:)これを実装してからパフォーマンスをテストすることをお勧めします。理想的にはここで停止できます。

ただし、OpenLayersで効率的に表示するにはポイントが多すぎる場合、Googleが小さな赤い点に対して行っているように見える最適化に到達します。

  • タイルレンダラーをフィルター処理された結果の完全なセットに接続し、結果ごとに小さなドットを除いて完全に透明なタイルを作成する必要があります。(設計決定:これらを熱心に、またはオンデマンドでのみ生成しますか?)

    • GeoServerなどでは、ユーザーごとにクエリごとに新しいレイヤーが必要になるため、「トリガー」コードが必要になります。ユーザーを追加するときに、GeoServerがレンダリングする新しいものを追加する必要があります。(また、レンダリング実装で使用できる形式で結果レコードを生成する必要があります)。また、古いタイルはどのくらいの頻度で再レンダリングされますか?

    • タイルレンダラーへのアクセスをプロキシするサーバーコードを少しお勧めします。これにより、誰かがURLを推測しても自分のものではない結果を見ることができなくなります。

  • 次に、ブラウザーに返される結果を分割する必要があります。最初のnはマーカーを配置する完全な結果で、残りは座標+コールバックURLとして送信されます。(レンダリングを担当していなくても、カーソルを変更し、ツールチップを提供し、クリックで意味のあるアクションを実行するには、ブラウザーがそれらの場所を知る必要があります!)

  • 次に、ブラウザーでJSコードを使用して、ドットとのやり取りを管理します。

私の知る限り、それほど遠くないのですが、上記のことを実行するための「すぐに使える」コードを書いた人は誰もいません。バックエンドにたくさんのシステム統合コードがあり、フロントエンド。


ダン、ありがとう。たくさんの「家庭料理」は私が期待したものですが、より良いまたはよりエレガントな解決策があるかどうかを本当に知りたいと思っていました。古いタイルはEMSの一部であり、データは常に更新されるため、頻繁に再レンダリングする必要があります。すでにクライアント側とサーバー側のクラスタリングが有効になっています。そして、それはトンを助けます。1000のポイントは30〜40になるため、それらのほとんどはクラスターです(「プラス」記号でレンダリングします)。ズーム/パンでは、新しいデータがBoundingBox戦略を通じてサーバーから読み込まれます。しかし、クラスタリングにより、マップから「乱雑」が取り除かれます。だから、そこにあるものの量の視覚を失う。
Vadim

追加するのを忘れました。いくつかの点で、「乱雑」は良いことです。また、可変サイズの円(たとえば、クラスター内の50点は大きな円、10は小さな円)だけでそれを表現するのは望ましくありません。これは、私たちのユースケースでは、小さなドットがたくさんあるのと同じ意味がないためです。地図上の。 ため息 :)
Vadim 2010

個人的に、私はポイントクラスタリングを軽視します。それは大量の情報を削除し、良い解釈がまったくできません。だから私はあなたと一緒にいます。また、マップが一般的なWebマップであるSpherical Mercatorのような単純な投影法の場合:タイルレンダリングを自分で行うことを検討してください。(lat / lonをタイルのピクセルX / Y座標に変換するコードはそれほど多くありません。OpenStreetMapでコードを見つけることができると思います)---システム統合、リダイレクトなどの多くを取り除くことになります。作業。(たとえば、機能を少なくして、ドットを派手なものにすることはできません!)
Dan S.

0

(最新の編集で言うように)ユーザーが表示できるIDを通知するために実行できるクエリがある場合、「最良の」解決策は、そのフィルターをCQLまたはOGCフィルターとしてエンコードすることです。 WMSリクエスト。これを実行可能にするには、データをビューに再編成する必要があることに気付くでしょう。

タイルキャッシュの使用を開始する前に、単純なバージョンをビルドして、十分に高速かどうかを確認し、さらに速度が必要な場合にのみ複雑にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.