08 Okt 2025·8 menit membaca

Desain Pencarian Global Berbasis Izin Tanpa Kebocoran Data

Pelajari cara merancang pencarian global berbasis izin dengan pengindeksan cepat dan pemeriksaan akses per-rekam yang ketat, sehingga pengguna mendapat hasil cepat tanpa kebocoran.

Desain Pencarian Global Berbasis Izin Tanpa Kebocoran Data

Mengapa pencarian global bisa membocorkan data

Pencarian global biasanya berarti satu kotak pencarian yang memindai seluruh aplikasi: pelanggan, tiket, faktur, dokumen, pengguna, dan apa pun yang dipakai orang. Ini sering menjadi sumber autocomplete dan halaman hasil cepat sehingga pengguna bisa langsung lompat ke sebuah rekaman.

Kebocoran terjadi ketika pencarian mengembalikan sesuatu yang pengguna tidak seharusnya tahu ada. Meski mereka tidak bisa membuka rekaman itu, satu baris seperti judul, nama seseorang, tag, atau cuplikan yang disorot bisa mengungkap informasi sensitif.

Pencarian terasa "hanya-baca," sehingga tim meremehkannya. Padahal pencarian dapat membocorkan data lewat judul hasil dan pratinjau, saran autocomplete, jumlah hasil, facet seperti "Customers (5)", dan bahkan perbedaan waktu (cepat untuk beberapa istilah, lambat untuk lainnya).

Masalah ini biasanya muncul belakangan, bukan di hari pertama. Awalnya tim meluncurkan pencarian ketika hanya ada satu peran, atau ketika semua orang bisa melihat segala sesuatu di database uji. Saat produk tumbuh, Anda menambah peran (dukungan vs penjualan, manajer vs agen) dan fitur seperti inbox bersama, catatan pribadi, pelanggan terbatas, dan "hanya akun saya." Jika pencarian masih bergantung pada asumsi lama, ia mulai mengembalikan petunjuk lintas-tim atau lintas-pelanggan.

Mode kegagalan yang umum adalah mengindeks "segala sesuatu" demi kecepatan, lalu mencoba memfilternya di aplikasi setelah kueri pencarian. Itu terlalu terlambat. Mesin pencari sudah memutuskan apa yang cocok, dan ia mungkin mengekspos rekaman terbatas lewat saran, hitungan, atau field parsial.

Bayangkan seorang agen dukungan yang seharusnya hanya melihat tiket untuk pelanggan yang ditugaskan padanya. Mereka mengetik "Acme" dan autocomplete menampilkan "Acme - Legal escalation" atau "Acme breach notification." Meski kliknya gagal dengan "akses ditolak," judul saja sudah merupakan kebocoran data.

Tujuan pencarian global berbasis izin sederhana diucapkan tapi sulit diimplementasikan: mengembalikan hasil cepat dan relevan sambil menegakkan aturan akses yang sama seperti saat membuka setiap rekaman. Setiap kueri harus berperilaku seolah pengguna hanya bisa melihat irisan data mereka, dan UI harus menghindari membocorkan petunjuk tambahan (seperti jumlah) di luar irisan itu.

Apa yang Anda indeks dan apa yang harus dilindungi

Pencarian global terasa sederhana karena pengguna mengetik kata dan mengharapkan jawaban. Di balik layar, Anda menciptakan area permukaan baru untuk eksposur data. Sebelum memilih indeks atau fitur database, pastikan dua hal jelas: objek apa yang Anda cari (entitas), dan bagian mana dari objek itu yang sensitif.

Sebuah entitas adalah setiap rekaman yang mungkin ingin ditemukan dengan cepat. Dalam sebagian besar aplikasi bisnis, itu termasuk pelanggan, tiket dukungan, faktur, pesanan, dan file (atau metadata file). Bisa juga termasuk rekaman orang (pengguna, agen), catatan internal, dan objek sistem seperti integrasi atau kunci API. Jika memiliki nama, ID, atau status yang mungkin diketik seseorang, besar kemungkinan akan masuk ke pencarian global.

Aturan per-rekam vs aturan per-tabel

Aturan per-tabel bersifat kasar: entah Anda dapat mengakses seluruh tabel, atau tidak. Contoh: hanya Finance yang bisa membuka halaman Faktur. Ini mudah dipahami, tapi gagal ketika orang berbeda harus melihat baris berbeda di tabel yang sama.

Aturan per-rekam memutuskan visibilitas baris demi baris. Contoh: agen dukungan bisa melihat tiket yang ditugaskan ke timnya, sementara manajer bisa melihat semua tiket di region mereka. Aturan umum lain adalah kepemilikan tenant: di aplikasi multi-tenant, pengguna hanya bisa melihat rekaman di mana customer_id = their_customer_id.

Di sinilah pencarian biasanya bocor. Jika indeks Anda mengembalikan hit sebelum Anda memeriksa akses baris, Anda sudah mengungkapkan bahwa sesuatu itu ada.

Apa arti "diizinkan melihat" dalam praktik

"Diizinkan" jarang hanya saklar ya/tidak tunggal. Biasanya menggabungkan kepemilikan (dibuat oleh saya, ditugaskan ke saya), keanggotaan (tim saya, departemen saya, peran saya), cakupan (region saya, unit bisnis, proyek), status rekaman (dipublikasikan, tidak-diarsipkan), dan kasus khusus (pelanggan VIP, penahanan hukum, tag terbatas).

Tuliskan aturan-aturan ini dengan bahasa yang jelas terlebih dulu. Nanti Anda akan mengubahnya menjadi model data plus pemeriksaan sisi-server.

Putuskan apa yang aman ditampilkan di pratinjau hasil

Hasil pencarian sering mencakup cuplikan pratinjau, dan cuplikan dapat membocorkan data meski pengguna tidak bisa membuka rekaman.

Default aman adalah menampilkan hanya field minimal dan non-sensitif sampai akses dikonfirmasi: nama tampilan atau judul (kadang dimask), identifier pendek (seperti nomor pesanan), status tingkat-tinggi (Open, Paid, Shipped), tanggal (dibuat atau diperbarui), dan label entitas generik (Ticket, Invoice).

Contoh konkret: jika seseorang mencari "Acme merger" dan ada tiket terbatas, mengembalikan "Ticket: Acme merger draft - Legal" sudah merupakan kebocoran. Hasil yang lebih aman adalah "Ticket: Restricted" tanpa cuplikan, atau tidak menampilkan hasil sama sekali, tergantung kebijakan Anda.

Mendefinisikan ini dengan benar sejak awal membuat keputusan selanjutnya lebih sederhana: apa yang Anda indeks, bagaimana Anda memfilter, dan apa yang bersedia Anda ungkapkan.

Persyaratan dasar untuk pencarian yang aman dan cepat

Orang menggunakan pencarian global ketika mereka buru-buru. Jika butuh lebih dari satu detik, mereka berhenti mempercayainya dan kembali ke penyaringan manual. Tapi kecepatan hanyalah setengah pekerjaan. Pencarian cepat yang membocorkan satu judul rekaman, nama pelanggan, atau subjek tiket lebih buruk daripada tidak ada pencarian sama sekali.

Aturan inti tidak bisa ditawar: tegakkan izin saat kueri dijalankan, bukan hanya di UI. Menyembunyikan baris setelah Anda mengambilnya sudah terlambat, karena sistem sudah menyentuh data yang seharusnya tidak dikembalikan.

Hal yang sama berlaku untuk segala sesuatu di sekitar pencarian, bukan hanya daftar hasil akhir. Saran, top hits, hitungan, dan bahkan perilaku "tidak ada hasil" bisa membocorkan informasi. Autocomplete yang menunjukkan "Acme Renewal Contract" kepada seseorang yang tidak bisa membukanya adalah kebocoran. Facet yang mengatakan "12 matching invoices" adalah kebocoran jika pengguna hanya boleh melihat 3. Bahkan waktu bisa bocor jika kecocokan terbatas membuat kueri lebih lambat.

Pencarian global yang aman membutuhkan empat hal:

  • Ketepatan: setiap item yang dikembalikan diizinkan untuk pengguna ini, untuk tenant ini, saat ini.
  • Kecepatan: hasil, saran, dan hitungan tetap konsisten cepat, bahkan pada skala besar.
  • Konsistensi: saat akses berubah (update peran, tiket dipindah), perilaku pencarian berubah dengan cepat dan dapat diprediksi.
  • Auditabilitas: Anda bisa menjelaskan mengapa sebuah item dikembalikan, dan bisa mencatat aktivitas pencarian untuk investigasi.

Perubahan mindset yang berguna: perlakukan pencarian sebagai API data lain, bukan fitur UI. Itu berarti aturan akses yang sama yang Anda terapkan ke halaman daftar juga harus diterapkan ke pembuatan indeks, eksekusi kueri, dan setiap endpoint terkait (autocomplete, pencarian terbaru, kueri populer).

Tiga pola desain umum (dan kapan menggunakannya)

Kotak pencarian mudah dibuat. Pencarian global berbasis izin lebih sulit karena indeks ingin mengembalikan hasil instan, sementara aplikasi Anda tidak boleh pernah mengungkap rekaman yang tidak dapat diakses pengguna, bahkan secara tidak langsung.

Berikut tiga pola yang paling sering dipakai tim. Pilihan yang tepat bergantung pada seberapa kompleks aturan akses Anda dan seberapa banyak risiko yang bisa Anda terima.

Pendekatan A: indeks hanya field "aman", lalu ambil setelah pemeriksaan izin. Anda menyimpan dokumen minimal di indeks pencarian, seperti ID plus label non-sensitif yang aman ditampilkan kepada siapa pun yang bisa mengakses UI pencarian. Saat pengguna mengklik hasil, aplikasi memuat rekaman penuh dari database utama dan menerapkan aturan izin nyata di sana.

Ini mengurangi risiko kebocoran, tapi bisa membuat hasil terasa tipis karena konteks sedikit. Juga perlu penulisan UI yang hati-hati agar label "aman" tidak tanpa sengaja mengekspos rahasia.

Pendekatan B: simpan atribut izin di indeks dan filter di sana. Anda menyertakan field seperti tenant_id, team_id, owner_id, flag peran, atau project_id di setiap dokumen yang diindeks. Setiap kueri menambahkan filter yang sesuai dengan cakupan pengguna saat ini.

Ini memberikan hasil kaya dan autocomplete cepat, tapi hanya bekerja ketika aturan akses bisa diekspresikan sebagai filter. Jika izin bergantung pada logika kompleks (misalnya, "ditugaskan ATAU on-call minggu ini ATAU bagian dari insiden"), menjadi sulit menjaga ketepatan.

Pendekatan C: hibrida. Filter kasar di indeks, pemeriksaan akhir di database. Anda memfilter di indeks menggunakan atribut stabil dan luas (tenant, workspace, customer), lalu memeriksa ulang izin pada kumpulan kecil ID kandidat di database utama sebelum mengembalikan apa pun.

Ini sering menjadi jalur teraman untuk aplikasi nyata: indeks tetap cepat, dan database tetap sumber kebenaran.

Memilih pola

Pilih A saat Anda menginginkan setup paling sederhana dan bisa menerima snippet minimal. Pilih B ketika Anda memiliki cakupan yang jelas dan sebagian besar statis (multi-tenant, akses berbasis tim) dan membutuhkan autocomplete sangat cepat. Pilih C ketika Anda memiliki banyak peran, pengecualian, atau aturan per-rekam yang berubah sering. Untuk data berisiko tinggi (HR, keuangan, medis), lebih baik pilih C karena "hampir benar" tidak dapat diterima.

Langkah demi langkah: merancang indeks yang menghormati aturan akses

Kontrol snippet dan preview
Gunakan logika bisnis visual untuk memeriksa ulang akses sebelum menampilkan preview sensitif.
Bangun Alur Kerja

Mulailah dengan menulis aturan akses Anda seperti saat menjelaskannya kepada rekan baru. Hindari "admin bisa melihat semua" kecuali benar-benar demikian. Jelaskan alasannya: "Agen dukungan dapat melihat tiket dari tenant mereka. Team lead juga dapat melihat tiket dari unit organisasi mereka. Hanya pemilik tiket dan agen yang ditugaskan yang dapat melihat catatan pribadi." Jika Anda tidak bisa mengatakan mengapa seseorang bisa melihat rekaman, Anda akan kesulitan mengkodekannya dengan aman.

Selanjutnya, pilih identifier yang stabil dan definisikan dokumen pencarian minimal. Indeks seharusnya bukan salinan penuh baris database Anda. Simpan hanya yang diperlukan untuk menemukan dan menampilkan di daftar hasil, seperti judul, status, dan mungkin cuplikan pendek non-sensitif. Letakkan field sensitif di belakang pengambilan kedua yang juga memeriksa izin.

Kemudian tentukan sinyal izin mana yang bisa Anda filter dengan cepat. Ini adalah atribut yang mengatur akses dan bisa disimpan di setiap dokumen yang diindeks, seperti tenant_id, org_unit_id, dan sejumlah kecil flag cakupan. Tujuannya adalah setiap kueri dapat menerapkan filter sebelum mengembalikan hasil, termasuk autocomplete.

Workflow praktis:

  1. Definisikan aturan visibilitas untuk setiap entitas (tiket, pelanggan, faktur) dengan bahasa yang jelas.
  2. Buat skema dokumen pencarian dengan record_id plus hanya field yang aman dan bisa dicari.
  3. Tambahkan field izin yang dapat difilter (tenant_id, org_unit_id, visibility_level) ke setiap dokumen.
  4. Tangani pengecualian dengan grant eksplisit: simpan allowlist (ID pengguna) atau ID grup untuk item bersama.

Item bersama dan pengecualian adalah tempat desain sering gagal. Jika sebuah tiket dapat dibagikan antar tim, jangan hanya "menambah boolean." Gunakan grant eksplisit yang bisa diperiksa oleh filter. Jika allowlist besar, lebih baik gunakan grant berbasis grup daripada per-user.

Menjaga indeks tetap sinkron tanpa kejutan

Bangun pencarian global yang aman
Bangun API pencarian berbasis izin dengan pemeriksaan sisi-server yang Anda kendalikan.
Mulai Membangun

Pengalaman pencarian yang aman bergantung pada satu hal membosankan yang dikerjakan dengan baik: indeks harus mencerminkan kenyataan. Jika rekaman dibuat, diubah, dihapus, atau izin berubah, hasil pencarian harus mengikuti dengan cepat dan dapat diprediksi.

Mengejar create, update, delete

Perlakukan pengindeksan sebagai bagian dari siklus hidup data. Model mental yang berguna: setiap kali sumber kebenaran berubah, Anda menerbitkan event dan indexer merespons.

Pendekatan umum termasuk trigger database, event aplikasi, atau job queue. Yang paling penting adalah event tidak hilang. Jika aplikasi Anda bisa menyimpan rekaman namun gagal mengindeksnya, Anda akan mendapat perilaku membingungkan seperti "Saya tahu itu ada tapi pencarian tak menemukannya."

Perubahan izin adalah perubahan indeks

Banyak kebocoran terjadi ketika konten diperbarui dengan benar, tapi metadata akses tidak. Perubahan izin datang dari update peran, pemindahan tim, transfer kepemilikan, reassignment pelanggan, atau tiket yang digabung ke kasus lain.

Jadikan perubahan izin event kelas-satu. Jika pencarian berbasis izin Anda mengandalkan filter tenant atau team, pastikan dokumen yang diindeks menyertakan field yang diperlukan untuk menegakkan itu (tenant_id, team_id, owner_id, allowed_role_ids). Saat field itu berubah, reindex.

Bagian yang rumit adalah radius ledakan. Perubahan peran mungkin memengaruhi ribuan rekaman. Rencanakan jalur reindex massal yang memiliki progres, retry, dan cara untuk pause.

Rencanakan eventual consistency

Bahkan dengan event yang baik, akan ada jendela di mana pencarian tertinggal. Putuskan apa yang harus dilihat pengguna dalam beberapa detik pertama setelah perubahan.

Dua aturan membantu:

  • Konsisten terhadap delay. Jika pengindeksan biasanya selesai dalam 2-5 detik, beri ekspektasi itu saat relevan.
  • Lebih baik hilang daripada bocor. Lebih aman jika rekaman yang baru diberikan muncul sedikit terlambat daripada rekaman yang aksesnya baru dicabut tetap muncul.

Tambahkan fallback aman saat indeks kadaluarsa

Pencarian untuk penemuan, tapi melihat detail adalah tempat kebocoran menyakitkan. Lakukan pemeriksaan izin kedua saat membaca sebelum menampilkan field sensitif. Jika sebuah hasil lolos karena indeks ketinggalan, halaman detail tetap harus memblokir akses.

Polanya: tampilkan cuplikan minimal di hasil, lalu periksa ulang izin saat pengguna membuka rekaman (atau memperluas pratinjau). Jika pemeriksaan gagal, tampilkan pesan jelas dan hapus item dari daftar terlihat pada refresh berikutnya.

Kesalahan umum yang menyebabkan kebocoran data

Pencarian bisa membocorkan data meski halaman "buka rekaman" Anda terkunci rapat. Pengguna mungkin tidak pernah mengklik hasil namun tetap mengetahui nama, ID pelanggan, atau ukuran proyek yang tersembunyi. Pencarian global berbasis izin harus melindungi bukan hanya dokumen, tapi juga petunjuk tentang dokumen.

Autocomplete adalah sumber kebocoran yang sering terjadi. Saran sering didorong oleh lookup prefix cepat yang melewatkan pemeriksaan izin penuh. UI tampak tak berbahaya, tapi satu huruf yang diketik bisa mengungkap nama pelanggan atau email karyawan. Autocomplete harus menjalankan filter akses yang sama seperti pencarian penuh, atau dibangun dari set saran yang sudah difilter (misalnya, per-tenant dan per-peran).

Jumlah facet dan banner "About 1,243 results" adalah kebocoran halus lain. Hitungan dapat mengonfirmasi sesuatu ada meski Anda menyembunyikan rekamannya. Jika Anda tidak dapat menghitung jumlah dengan aman di bawah aturan akses yang sama, tampilkan lebih sedikit detail atau hilangkan hitungan.

Caching adalah penyebab umum lain. Cache bersama antar pengguna, peran, atau tenant dapat menciptakan "result ghosts," di mana satu pengguna melihat hasil yang dibuat untuk orang lain. Ini bisa terjadi di edge cache, cache tingkat aplikasi, dan cache in-memory di dalam layanan pencarian.

Perangkap kebocoran yang perlu diperiksa lebih awal:

  • Autocomplete dan pencarian terbaru difilter oleh aturan yang sama dengan pencarian penuh.
  • Hitungan facet dan total dihitung setelah izin diterapkan.
  • Kunci cache menyertakan tenant ID dan tanda tangan izin (peran, tim, user ID).
  • Log dan analytics tidak menyimpan query mentah atau cuplikan hasil untuk data terbatas.

Akhirnya, waspadai filter yang terlalu luas. "Filter by tenant only" adalah kesalahan klasik multi-tenant, tapi hal serupa terjadi di dalam satu tenant: memfilter dengan "department" ketika akses sebenarnya per-rekam. Contoh: agen dukungan mencari "refund" dan mendapat hasil di seluruh pelanggan dalam tenant, termasuk akun VIP yang seharusnya hanya terlihat oleh tim kecil. Perbaikannya sederhana secara prinsip: tegakkan aturan tingkat-baris di setiap jalur kueri (pencarian, autocomplete, facet, ekspor), bukan hanya di tampilan rekaman.

Detail privasi dan keamanan yang sering terlupakan

Jalankan rencana tes fokus kebocoran
Putar aplikasi staging untuk menguji kebocoran lewat jumlah, facet, dan state kosong.
Uji Sekarang

Banyak desain fokus pada "siapa bisa melihat apa," tetapi kebocoran juga terjadi melalui tepi: state kosong, timing, dan petunjuk kecil di UI. Pencarian berbasis izin harus aman bahkan saat tidak mengembalikan apa pun.

Satu kebocoran mudah adalah konfirmasi lewat absensi. Jika pengguna tidak sah mencari nama pelanggan tertentu, ID tiket, atau email dan mendapatkan pesan khusus seperti "No access" atau "You don't have permission," Anda telah mengonfirmasi rekaman itu ada. Perlakukan "tidak ada hasil" sebagai outcome default untuk kedua kasus "tidak ada" dan "ada tetapi tidak diizinkan." Jaga waktu respons dan kata-kata konsisten supaya orang tidak bisa menebak berdasarkan kecepatan.

Kecocokan parsial sensitif

Autocomplete dan search-as-you-type adalah tempat privasi mudah tergelincir. Kecocokan parsial pada email, nomor telepon, dan ID pemerintah atau pelanggan dapat mengekspos lebih dari yang dimaksud. Putuskan sejak awal bagaimana field ini berperilaku.

Aturan praktis:

  • Minta kecocokan exact untuk field berisiko tinggi (email, telepon, ID).
  • Hindari menampilkan cuplikan yang menyorot teks tersembunyi.
  • Pertimbangkan menonaktifkan autocomplete untuk field sensitif sepenuhnya.

Jika menampilkan satu karakter pun membantu seseorang menebak data, anggap itu sensitif.

Kontrol penyalahgunaan yang tidak menambah risiko baru

Endpoint pencarian ideal untuk serangan enumerasi: mencoba banyak kueri untuk memetakan apa yang ada. Tambahkan rate limit dan deteksi anomali, tapi hati-hati dengan apa yang Anda simpan. Log yang berisi query mentah bisa menjadi kebocoran kedua.

Sederhanakan: rate limit per pengguna, per IP, dan per tenant; catat jumlah, waktu, dan pola kasar (bukan teks kueri penuh); beri alert pada urutan "near-miss" berulang (seperti ID berurutan); dan blok atau tingkatkan verifikasi setelah kegagalan berulang.

Buat error Anda membosankan. Gunakan pesan dan state kosong yang sama untuk "no results," "not allowed," dan "invalid filters." Semakin sedikit UI pencarian Anda berkata, semakin sedikit yang bisa terungkap tanpa sengaja.

Contoh: tim dukungan mencari tiket antar pelanggan

Satu pemeriksaan izin di mana-mana
Buat satu alur pencarian yang menjadi sumber untuk hasil, saran, dan ekspor dengan aman.
Bangun Sekarang

Seorang agen dukungan, Maya, bekerja pada tim yang menangani tiga akun pelanggan. Dia punya satu kotak pencarian di header aplikasi. Produk punya indeks global atas tiket, kontak, dan perusahaan, tetapi setiap hasil harus mematuhi aturan akses.

Maya mengetik "Alic" karena penelepon mengatakan namanya Alice. Autocomplete menampilkan beberapa saran. Dia mengklik "Alice Nguyen - Ticket: Password reset." Sebelum membuka apa pun, aplikasi memeriksa ulang akses untuk rekaman itu. Jika tiket masih ditugaskan ke timnya dan perannya memungkinkannya, dia masuk ke tiket.

Apa yang Maya lihat di setiap langkah:

  • Kotak pencarian: saran muncul cepat, tapi hanya untuk rekaman yang bisa dia akses saat ini.
  • Daftar hasil: subjek tiket, nama pelanggan, waktu terakhir diperbarui. Tidak ada placeholder "Anda tidak punya akses."
  • Detail tiket: tampilan penuh dimuat hanya setelah pemeriksaan izin sisi-server kedua. Jika akses berubah, aplikasi menampilkan "Ticket not found" (bukan "forbidden").

Sekarang bandingkan dengan Leo, agen baru dalam pelatihan. Perannya hanya bisa melihat tiket yang ditandai "Public to Support" dan hanya untuk satu pelanggan. Leo mengetik kueri yang sama, "Alic." Dia melihat lebih sedikit saran, dan tidak ada item yang hilang yang diperlihatkan sebagai petunjuk. UI hanya menampilkan apa yang bisa dia buka.

Nanti, seorang manajer memindahkan "Alice Nguyen - Password reset" dari tim Maya ke tim eskalasi khusus. Dalam jendela singkat (biasanya detik hingga beberapa menit, bergantung pendekatan sinkron Anda), pencarian Maya berhenti mengembalikan tiket itu. Jika dia membuka halaman detail dan menyegarkan, aplikasi memeriksa izin lagi dan tiket menghilang.

Itu perilaku yang Anda inginkan: pengetikan cepat dan hasil cepat, tanpa aroma data yang bocor lewat hitungan, cuplikan, atau entri indeks usang.

Daftar periksa dan langkah selanjutnya untuk mengimplementasikan dengan aman

Pencarian global berbasis izin baru "selesai" ketika tepi-tepi membosankan itu aman. Banyak kebocoran terjadi di tempat yang terasa tidak berbahaya: autocomplete, jumlah hasil, dan ekspor.

Pemeriksaan cepat keamanan

Sebelum diluncurkan, jalankan pemeriksaan ini dengan data nyata, bukan sampel:

  • Autocomplete: jangan pernah menyarankan judul, nama, atau ID yang pengguna tidak bisa buka.
  • Hitungan dan facet: jika menampilkan total atau hitungan grup, hitung setelah izin diterapkan (atau hilangkan hitungan).
  • Ekspor dan aksi massal: mengekspor "pencarian saat ini" harus memeriksa akses per baris pada waktu ekspor.
  • Penyortiran dan penyorotan: jangan menyortir atau menyorot menggunakan field yang pengguna tidak boleh lihat.
  • "Not found" vs "forbidden": untuk entitas sensitif, pertimbangkan bentuk respons yang sama sehingga pengguna tidak bisa memastikan keberadaan.

Rencana pengujian yang bisa dijalankan

Buat matriks peran kecil (peran x entitas) dan dataset dengan kasus-kasus sengaja rumit: rekaman bersama, akses yang baru dicabut, dan lookalike lintas-tenant.

Uji dalam tiga putaran: (1) uji matriks peran di mana Anda memverifikasi rekaman yang ditolak tidak pernah muncul di hasil, saran, hitungan, atau ekspor; (2) tes "coba pecahkan" di mana Anda menempelkan ID, mencari dengan email atau telepon, dan mencoba kecocokan parsial yang seharusnya tidak mengembalikan apa pun; (3) tes timing dan cache di mana Anda mengubah izin dan memastikan hasil diperbarui cepat tanpa saran usang.

Secara operasional, rencanakan hari ketika hasil pencarian "kelihatan salah." Catat konteks kueri (pengguna, peran, tenant) dan filter izin yang diterapkan, tapi hindari menyimpan string kueri mentah atau cuplikan sensitif. Untuk debugging aman, buat alat hanya-untuk-admin yang dapat menjelaskan mengapa sebuah rekaman cocok dan mengapa diizinkan.

Jika Anda membangun di AppMaster (appmaster.io), pendekatan praktis adalah menjaga pencarian sebagai alur sisi-server: modelkan entitas dan relasi di Data Designer, terapkan aturan akses di Business Processes, dan gunakan pemeriksaan izin yang sama untuk autocomplete, daftar hasil, dan ekspor sehingga hanya ada satu tempat untuk memperbaikinya.

Mudah untuk memulai
Ciptakan sesuatu yang menakjubkan

Eksperimen dengan AppMaster dengan paket gratis.
Saat Anda siap, Anda dapat memilih langganan yang tepat.

Memulai
Desain Pencarian Global Berbasis Izin Tanpa Kebocoran Data | AppMaster