Dengan asumsi struktur database berikut (dapat dimodifikasi jika perlu) ...
Saya mencari cara yang bagus untuk menentukan "izin efektif" untuk pengguna yang diberikan pada halaman tertentu dengan cara yang memungkinkan saya mengembalikan baris yang berisi Halaman dan izin efektif.
Saya berpikir bahwa solusi ideal dapat mencakup fungsi yang menggunakan CTE untuk melakukan rekursi yang diperlukan untuk mengevaluasi "izin efektif" untuk baris halaman yang diberikan untuk pengguna saat ini.
Latar belakang dan detail implementasi
Skema di atas merupakan titik awal untuk sistem manajemen konten di mana pengguna dapat diberikan izin dengan ditambahkan dan dihapus dari peran.
Sumber daya dalam sistem (misalnya halaman) dikaitkan dengan peran untuk memberikan kelompok pengguna yang ditautkan ke peran itu, izin yang diberikannya.
Idenya adalah untuk dapat dengan mudah mengunci pengguna hanya dengan menyangkal semua peran dan menambahkan halaman level root di pohon ke peran itu dan kemudian menambahkan pengguna ke peran itu.
Ini akan memungkinkan struktur izin tetap di tempat ketika (misalnya) kontraktor yang bekerja untuk perusahaan tidak tersedia untuk jangka waktu lama, ini juga akan memungkinkan pemberian izin yang sama dengan izin asli mereka hanya dengan menghapus pengguna dari satu peran itu .
Izin didasarkan pada aturan tipe ACL khas yang mungkin berlaku untuk sistem file dengan mengikuti aturan ini.
Izin CRUD harus bit nullable sehingga nilai yang tersedia benar, salah, tidak didefinisikan di mana yang berikut ini benar:
- false + anything = false
- true + not defined = true
- true + true = benar
- tidak didefinisikan + tidak didefinisikan = tidak didefinisikan
Jika salah satu izin salah -> salah Jika ada yang benar -> benar Lain (semua tidak didefinisikan) -> false
Dengan kata lain Anda tidak mendapatkan izin apa pun kecuali Anda diberikan mereka melalui keanggotaan peran dan aturan penolakan menimpa aturan izin.
"Set" izin yang berlaku untuk ini adalah semua izin yang diterapkan ke pohon hingga dan termasuk halaman saat ini, dengan kata lain: Jika salah dalam peran apa pun diterapkan ke halaman mana saja di pohon ke halaman ini maka hasilnya salah , tetapi jika keseluruhan pohon hingga di sini tidak ditentukan maka halaman saat ini berisi aturan yang benar hasilnya adalah benar di sini tetapi akan menjadi salah untuk induknya.
Saya ingin secara longgar menjaga struktur db jika memungkinkan, juga perlu diingat bahwa tujuan saya di sini adalah untuk dapat melakukan sesuatu seperti: select * from pages where effective permissions (read = true) and user = ?
jadi solusi apa pun harus dapat membuat saya memiliki seperangkat yang dapat dicari dengan izin efektif di dalamnya di beberapa cara (mengembalikannya adalah opsional selama kriteria dapat ditentukan).
Dengan asumsi 2 halaman ada di mana 1 adalah anak dari yang lain dan 2 peran ada, satu untuk pengguna admin dan 1 untuk pengguna hanya baca, keduanya terkait dengan hanya halaman tingkat root saya akan berharap untuk melihat sesuatu seperti ini sebagai output yang diharapkan:
Admin user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, True , True, True , True
2, 1, Child,True , True, True , True
Read only user:
Id, Parent, Name, Create, Read, Update, Delete
1, null, Root, False , True, False , False
2, 1, Child,False , True, False , False
Diskusi lebih lanjut seputar pertanyaan ini dapat ditemukan di ruang obrolan situs utama mulai dari sini .