WMS dengan Access Control (ACL) untuk pengguna yang berbeda? Atau solusi untuk ribuan titik di peta web?


8

Saya memiliki satu set situs dalam ribuan. Tidak semua pengguna melihat Situs yang sama di peta - dengan demikian ACL. Data disimpan dalam database non-GIS (mssql, ora, dll) dan sekarang diambil dengan query SQL standar dan dikembalikan ke klien (OpenLayers) dengan JSP.

Kode saat ini sudah dioptimalkan untuk melakukan pengelompokan sisi-klien (jadi lebih sedikit kekacauan pada klien, tetapi semua data ada di sana), pengambilan kotak-terikat (jadi sub-set data tetapi harus pergi ke server untuk setiap pan / zoom untuk data baru) dan bahkan pengelompokan sisi server (untuk mengurangi data dikirim ke klien).

Yang ingin saya lakukan adalah menghasilkan gambar / ubin untuk semua data saya, mirip dengan cara Google Maps menunjukkan banyak titik merah kecil untuk semua hasil - http://bit.ly/d73qrw [pencarian peta google untuk "kopi"] dan ditampilkan pada klien. Dan ketika diklik, lakukan panggilan ajax cepat ke layanan WMS untuk mendapatkan info. Setidaknya itulah idenya.

Tapi ini masalahnya - saya tidak bisa hanya mengatur layanan WMS standar di depan data saya karena tidak semua pengguna melihat data yang sama. Apakah ada cara untuk menghasilkan ubin ini dengan cepat atau membuat WMS ACL-sadar?

sunting - 9/22/2010 - Jadi saya menemukan bagaimana google menghasilkan ubin, atau tepatnya teknologi di baliknya. Mereka menggunakan Google Fusion Tables. Simpan N baris dalam tabel mereka dan kemudian jika data lat / lon sadari, produk Fusion Table dapat menghasilkan ubin langsung (!). Ini adalah hal yang saya cari - peta pemain dengan banyak data. Tapi tentu saja saya membutuhkannya untuk dikontrol ACL. Apakah masuk akal untuk menulis implementasi ringan spesifikasi WMS khusus atau memodifikasi produk yang ada? Meskipun geoserver sepertinya banyak "hanya" memodifikasi untuk mendukung ACL.

sunting - 9/27/2010 - Beberapa info lainnya sejak menambahkan hadiah. Data saya ada di Oracle. Ora spatial tidak diaktifkan. Saat ini data diekstraksi di tingkat bisnis dan dikonversi ke data, dikirim ke klien di mana klien meletakkan "titik-titik" di peta. ACL dilakukan pada tingkat logika bisnis, bukan DB atau ActivDir atau semacamnya. Otentikasi sederhana, tetapi Otorisasi tidak dan harus ditangkap dalam kode. Ingin tahu cara terbaik membuat layanan WMS untuk menyajikan 1000's "titik" pada peta di mana setiap pengguna akan melihat subset titik yang berbeda. Apakah jawabannya CQL_FILTER? Tapi lalu bagaimana parameternya? Satu ide yang saya miliki sekarang adalah melakukan proses 2 langkah. Pertama jalankan in-house query untuk mendapatkan daftar ID yang diizinkan untuk dilihat oleh pengguna, kemudian buat string permintaan WMS dengan ID tersebut dalam parameter CQL_FILTER. Adakah yang menyederhanakan proses ini? Dan jika saya menggunakan ini, bagaimana saya bisa menambahkan lapisan ini sebagai lapisan "WMS" ke klien Open Layers karena untuk OL titik akhir adalah kode saya untuk mendapatkan ID dari DB bukan layanan WMS aktual misalnya GeoServer?


@daftar ID di CQL_FILTER: Jika daftar ini semakin panjang, kinerja Geoserver akan menjadi sangat buruk. Setidaknya itulah pengalaman saya. Pertanyaan serupa: gis.stackexchange.com/q/1654/187
underdark

Hanya ingin mengatakan, kami telah bergulat dengan masalah yang sangat mirip, dan saya terdorong untuk mendengar orang lain membicarakannya. Kami memiliki beberapa ide tetapi masing-masing memiliki timbal baliknya sendiri. Saya berharap dapat kembali ke utas ini untuk berkontribusi dan / atau belajar sesuatu.
LarsH

Jawaban:


3

2

Saya pikir solusi umum adalah membuat skrip proxy atau pembungkus yang berada di antara klien dan WMS. Proxy digunakan untuk membuat panggilan WMS khusus berdasarkan parameter dari klien.

Anda belum menyebutkan apakah tujuan Anda untuk pengaturan ini adalah keamanan atau hanya penyesuaian, atau informasi apa yang harus dimiliki klien untuk menentukan 'tampilan' khusus dari data yang harus dihasilkan WMS.

Jika Anda akan menampilkan lebih dari beberapa ratus poin, Anda ingin tetap menggunakan layanan berbasis gambar seperti WMS. Bergantung pada kebutuhan Anda, Anda juga bisa menempatkan MapServer di belakang skrip wrapper yang membuat permintaan peta khusus berdasarkan parameter filter atau ekspresi yang unik.


David, tujuannya adalah kustomisasi. Keamanan juga, tapi mari kita asumsikan itu sudah diurus. Tetapi apa yang dilihat pengguna tergantung pada hak penggunanya. Jadi mereka (1) masuk, (2) membuka peta dan kemudian melihat Situs yang diizinkan untuk mereka lihat. Bisakah Anda memperluas ide MapServer / GeoServer (saya orang Jawa) di balik bungkus yang meminta dengan filter. Apakah Anda benar-benar bermaksud parameter "FILTER" atau "CQL_FILTER" atau yang lainnya? Saya sudah meneliti opsi CQL_FILTER sejak saya posting, tetapi belum bisa mengujinya di mana pun secara online.
Vadim

2

Saya punya jawaban yang berhasil bagi kami setelah beberapa percobaan dan kesalahan.

Oracle Spatial + Oracle VPD melakukan trik. Kami sudah menggunakan Ora, dan VPD, jadi ini adalah langkah logis berikutnya. Ora spatial memiliki layanan WMS dan dapat disesuaikan agar berbeda untuk pengguna yang berbeda berdasarkan hak / ACL mereka melalui VPD. Jika orang lain mencari sesuatu seperti ini, saya menyadari tidak semua operasi memiliki atau mampu membeli Oracle, tetapi jika Anda memilikinya - ada di sana. Tidak tahu apakah MS SQL Server memiliki fungsi serupa.


1

Gagasan lain (saya tidak yakin apakah ini benar-benar praktis). Yang Anda butuhkan adalah pemetaan antara izin pengguna dan file peta yang dihasilkan. Jadi, mengapa tidak membuat hash dari izin pengguna dan petak / ekstensi peta yang diminta? Hash ini memetakan ke ubin yang dibuat. Jika peta tidak ada di sana, itu jelas perlu dibuat, jika tidak maka dapat diambil dari cache peta. Tentu saja, pendekatan ini tidak membawa manfaat jika setiap pengguna melihat set data yang sama sekali berbeda. Tetapi jika semua pengguna termasuk dalam kelompok set izin terbatas, ini akan sangat membantu.

Daniel


1

Apa tenggat waktu Anda? Di Geomajas, kami sudah memiliki batasan keamanan / akses data. Kami sedang mengerjakan caching / rasterisasi pada saat ini yang akan menghasilkan jenis sistem yang Anda cari. Itu harus selesai dalam beberapa minggu.


hmmm. Saya tertarik untuk mendengar lebih banyak. Kami tidak terburu-buru. Seperti yang saya sebutkan di atas (saya tahu, ada banyak yang harus dibaca) kita sudah memiliki solusi client + server clustering yang berfungsi. Tapi saya ingin mengonversinya menjadi solusi berbasis ubin yang mirip dengan ubin Google Maps dengan banyak titik pada ubin. Bagaimana produk Anda dikaitkan dengan model keamanan yang ada tetapi sesuai pesanan? Kami tidak berada di oAuth atau Activ Dir atau seperti itu.
Vadim


0

Kemungkinan solusi ini gila, tetapi ini dia.

Mengapa bukan server WMS per pengguna? Misalkan kita menggunakan MapServer. Konfigurasi MapServer disimpan dalam file .map (alias mapfile), tetapi tidak ada yang melarang menggunakan beberapa mapfile. Ketika permintaan WMS dilakukan, salah satu parameter spesifik vendor yang akan diterima MapServer adalah 'map', yang merupakan string yang berisi path dan nama file dari mapfile yang digunakan [1]. Jika dalam WMS Anda meminta mapfile yang berbeda dikirim tergantung pada id dari pengguna yang sebelumnya login, maka Anda akan mendapatkan sebagai server WMS sebagai pengguna, dan hanya dengan satu instalasi MapServer.

Di sisi keamanan, Anda harus memeriksa mapfile yang digunakan terhadap id sesi, tugas yang kemungkinan akan dilakukan oleh proxy antara klien dan MapServer. Seorang pengguna yang ingin melihat peta pengguna lain secara manual dapat mengubah URL yang mengubah parameter 'peta', dan tindakan pencegahan cek ini akan membuat upaya tersebut tidak berhasil.

The kontra (kegilaan) dari solusi ini adalah untuk setiap pengguna mapfile harus dihasilkan. Jelas, jika jumlah pengguna tinggi, solusi ini tidak praktis, kecuali mapfile dapat secara otomatis dihasilkan dan diperbarui, bila diperlukan, dengan menggunakan skrip atau mekanisme serupa.

[1] Jika menggunakan MapServer, parameter 'map' sebenarnya wajib.


Saya menghargai tulisan yang panjang, namun solusinya tidak praktis karena sistem ini memiliki banyak pengguna yang juga dapat ditambahkan atau dihapus kapan saja dan hak istimewa / filter penglihatan data mereka diubah setiap saat oleh akun admin juga.
Vadim

0

Ada beberapa bagian yang bergerak di sini.

Pertama, ada memfilter poin: Ini harus dilakukan di sisi server, segera setelah atau selama permintaan SQL Anda.

Kemudian poin yang disaring perlu dikembalikan ke klien.

Itu adalah bagian yang sederhana. :) Saya akan merekomendasikan Anda menerapkan ini kemudian menguji kinerja, dan idealnya akan bisa berhenti di sini.

Namun, jika Anda memiliki terlalu banyak titik untuk ditampilkan secara efisien di OpenLayers, maka Anda mendapatkan optimasi yang dilakukan google untuk titik-titik merah kecil:

  • Anda perlu menghubungkan renderer ubin ke set lengkap hasil yang difilter, menghasilkan ubin sepenuhnya transparan kecuali untuk titik kecil per hasil. (Keputusan desain: hasilkan dengan penuh semangat, atau hanya berdasarkan permintaan?)

    • GeoServer, dll, akan memerlukan kode 'pemicu' karena mereka akan membutuhkan lapisan baru per permintaan per pengguna; saat Anda menambahkan pengguna, Anda harus menambahkan hal-hal baru untuk GeoServer render. (Selain itu, Anda harus menghasilkan catatan hasil dalam format yang dapat dikonsumsi oleh implementasi rendering). Dan seberapa sering ubin lama dirender ulang?

    • Saya akan merekomendasikan sedikit kode server yang proksi akses ke penyaji ubin - dengan cara itu seseorang tidak akan dapat melihat hasil yang bukan milik mereka dengan menebak URL.

  • Selanjutnya, hasil yang sedang dikembalikan ke browser perlu dipartisi: N pertama adalah hasil lengkap yang menempatkan penanda, sedangkan sisanya dikirim sebagai koordinat + URL panggilan balik. (Bahkan jika itu tidak bertanggung jawab untuk merendernya, browser perlu tahu di mana mereka berada untuk mengubah kursor, memberikan tooltip, dan memiliki tindakan yang berarti terjadi dengan sekali klik!)

  • Lalu ada kode JS di browser untuk mengatur interaksi tanpa titik.

Sejauh yang saya tahu, yang tidak terlalu jauh, tidak ada yang menulis kode 'out of the box' untuk melakukan hal di atas: Anda sedang melihat banyak kode integrasi sistem di backend dan cukup banyak JS baru di paling depan.


Terima kasih Dan. Banyak "masakan rumah" adalah apa yang saya harapkan, tetapi benar-benar ingin tahu apakah ada solusi yang lebih baik atau lebih elegan. Ubin lama harus sering diubah karena ini adalah bagian dari EMS dan data terus diperbarui. Saya sudah mengaktifkan pengelompokan sisi klien dan server. Dan itu membantu satu ton. Karena 1000 poin menjadi hanya 30-40 di mana kebanyakan dari mereka adalah cluster (yang saya render dengan tanda "plus"). Pada zoom / pan data baru dimuat dari server melalui strategi BoundingBox. Tetapi pengelompokan menghapus "kekacauan" dari peta. Jadi Anda kehilangan visual tentang berapa banyak barang yang ada di sana.
Vadim

Lupa menambahkan. Dalam beberapa hal "kekacauan" adalah hal yang baik. Dan kami tidak ingin mewakilinya hanya dengan lingkaran berukuran variabel (mis. Lingkaran besar untuk 50 poin dalam kelompok, dan kecil untuk 10) karena untuk kasus penggunaan kami, itu tidak memiliki arti yang sama dengan memiliki banyak titik kecil di peta. huh :)
Vadim

Secara pribadi, saya membenci pengelompokan titik: ia menghilangkan sejumlah besar informasi dan tidak memiliki interpretasi yang baik sama sekali. Jadi aku di sana bersamamu. Juga, jika peta Anda dalam proyeksi sederhana seperti peta web khas Spherical Mercator: Anda dapat mempertimbangkan untuk membuat ubin sendiri. (Tidak banyak kode untuk mengubah lat / lon menjadi piksel X / Y koordinat untuk ubin; Saya pikir Anda dapat menemukan kode pada OpenStreetMap) --- yang akan menyingkirkan banyak integrasi sistem, mengarahkan ulang, dll. kerja. (dengan mengorbankan fitur yang lebih sedikit, mis. Anda tidak dapat menjadikan titik-titik itu mewah!)
Dan S.

0

Jika Anda memiliki kueri yang dapat dieksekusi untuk memberi tahu Anda ID mana yang dapat dilihat pengguna (seperti yang Anda katakan di edit terakhir) maka solusi "terbaik" mungkin adalah untuk menyandikan filter itu sebagai filter CQL atau OGC sebagai bagian dari Permintaan WMS. Anda mungkin menemukan bahwa mengatur ulang data menjadi tampilan diperlukan untuk membuat ini layak.

Sebelum Anda mulai menggunakan Tile Cache, saya akan membuat versi sederhana dan melihat apakah itu cukup cepat, dan kemudian menjadi kompleks jika dan hanya jika Anda membutuhkan lebih banyak kecepatan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.