Buat filter Otentikasi khusus di GeoServer 2.3.0

10

Konteks

Dalam proyek saya saat ini, saya memiliki persyaratan untuk memvalidasi bahwa permintaan yang datang ke GeoServer (2.3.0) diizinkan.

Proyek memegang fakta-fakta itu:

  • klien GS tidak dapat memberikan informasi utama (kata sandi misalnya), GS itu sendiri tidak memiliki koneksi dengan repo pengguna / peran

Jadi kami mengambil kesempatan untuk menggunakan mekanisme filter auth untuk memeriksa bahwa:

  • permintaan yang valid (ke lapisan WFS tertentu) berisi HTTP Header khusus (misalkan X-CUSTOM-VALID)
  • Header ini adalah pesan yang disandikan JSON yang menyimpan informasi yang cukup untuk memvalidasi fakta bahwa permintaan tersebut diprakarsai oleh klien yang terhubung ke sistem ketiga yang valid (nama pengguna, rahasia, hal-hal seperti itu)

Status

The dokumentasi mengatakan kepada kita bahwa kita harus bisa melakukannya ...

Namun, dokumentasi tidak jelas cara membuat komponen seperti itu dan bagaimana mereka harus dikonfigurasi.

Debugging GeoServer Saya berhasil menemukan bahwa untuk mengkonfigurasi filter semacam itu, diperlukan Penyedia Autentikasi khusus. Itu, untuk memiliki panel di antarmuka admin web (di bawah otentikasi, dalam daftar Filter Otentikasi)

Panel

Jadi kode saya terdiri dari file-file itu:

  • ProducteurAuthFilterPanel.java
  • ProducteurAuthFilterPanelInfo.java
  • ProducteurAuthenticationFilterConfig.java
  • ProducteurAuthenticationFilterPanel.html

Ini diperlukan untuk menambahkan panel di Antarmuka Admin Web. ProducteurAuthFilterPanelInfoadalah merekatkan keduanya bersama dengan yang ProducteurAuthenticationFilterberikut (THE filter ^^).

Yang ProducteurAuthenticationFilterConfigmenyatakan bahwa dalam konstruktornya:

setClassName(ProducteurAnonymousAuthenticationProvider.class.getName());
setName("producteur");

Filter (dan Penyedia)

Sekarang, kelas-kelas yang diperlukan untuk membuat filter untuk dimasukkan dalam rantai (saya kira):

  • ProducteurAuthenticationFilter : implementasi filter memperluas GeoServerSecurityFilterdan mengimplementasikanGeoServerAuthenticationFilter
  • ProducteurAnonymousAuthenticationProvider: entah bagaimana diperlukan oleh Panel (di atas) untuk mendefinisikan filter baru
  • ProducteurAuthenticationException: digunakan dalam AuthenticationEntryPoint (hanya Http403ForbiddenEntryPoint untuk saat ini)

Akhirnya, kacang didefinisikan seperti:

<bean id="yaanonymousFilterProvider" class="dgarne.java.geoserver.security.ProducteurAnonymousAuthenticationProvider"/>

<bean id="producteurAuthPanelInfo" class="dgarne.java.geoserver.security.ProducteurAuthFilterPanelInfo">
    <property name="id" value="security.producteurAuthFilter" />
    <property name="shortTitleKey" value="ProducteurAuthFilterPanel.short"/>
    <property name="titleKey" value="ProducteurAuthFilterPanel.title"/>
    <property name="descriptionKey" value="ProducteurAuthFilterPanel.description"/>
</bean>

Di akhir permainan, di Antarmuka Admin Web saya memiliki Item baru di panel filter, dan saya menggunakannya dalam pemetaan default (lihat gambar di bawah untuk referensi): masukkan deskripsi gambar di sini

Deskripsi masalah

Di sini kita ...

Tidak ada permintaan WFS saya yang dikeluarkan oleh klien (OpenLayers) yang cocok dengan pemetaan default (/ **) melalui Filter yang ditentukan. Saat debugging saya menemukan bahwa rantai filter yang didefinisikan dalam Konteks Musim Semi tidak pernah termasuk definisi saya, tetapi selalu termasuk yang klasik menggunakan baik anonim, intisari atau dasar ...

Pertanyaan

Jadi, adakah yang bisa menunjukkan saya dengan (banyak ^^) dokumentasi yang lebih lengkap tentang bagaimana saya harus melakukannya?

andy petrella
sumber

Jawaban:

1

Saya melakukannya dengan menerapkan Proksi seperti ini yang dapat memverifikasi kredensial pengguna sebagai login menggunakan variabel sesi dan hanya memungkinkan mereka untuk mengakses sumber daya yang berhak, yaitu: memeriksa url untuk lapisan yang dipanggil dan menolak akses jika pengguna tidak diizinkan untuk melihatnya.

Jika Anda ingin membatasi pengguna untuk area atau set fitur tertentu, ada dua pendekatan ..

  1. Gunakan Tampilan SQL Parameter untuk mengontrol data apa yang akan dilihat pengguna. Anda bisa menggunakan Proxy untuk mengubah url sebelum diteruskan ke Geoserver dengan parameter khusus untuk pengguna itu. Anda juga dapat mengirim parameter kembali ke Openlayers melalui Panggilan Ajax setelah pengguna diautentikasi dan menyediakan parameter sebagai bagian dari panggilan getMAP WMS di OpenLayers. Data aktual yang ditampilkan dapat ditangani oleh substitusi Variabel di SLD untuk memfilter data yang ditampilkan atau dengan menggunakan Gaya Eksternal di panggilan WMS getMap Anda untuk mengubah SLD yang digunakan pengguna untuk menampilkan lapisan yang diberikan.

  2. Gunakan Panggilan Ajax setelah Otentikasi Pengguna untuk menentukan Map Extents agar hanya memungkinkan pengguna untuk berpindah di sekitar area yang ditentukan. Anda juga bisa menggunakan layerVisibility () untuk membatasi data apa yang bisa ditampilkan juga.

Mark Cupitt
sumber