Saya melihat desain antarmuka saya dan saya berjuang untuk memutuskan mana yang paling "benar" cara untuk menerapkan kontrol akses berbasis peran, mengingat userdan subjectyang useringin diakses.
Sejauh yang saya bisa lihat, saya memiliki tiga opsi inti (dengan yang keempat menjadi bastardisasi dari tiga yang pertama dan yang kelima menjadi tweak dari yang keempat):
- Minta
subjectdengan daftar izin yanguserdimiliki -subject.allowAccess(user.getPermissionSet) - Permintaan
userdengan daftar izin yangsubjectdibutuhkan -user.hasPermissionTo(subject.getRequiredPermissions()) - Minta pihak ketiga untuk menemukan persimpangan izin -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Minta salah satu dari
subject/user, sambil mendelegasikan "keputusan" ke kelas pihak ketiga - Usahakan
useruntuk mengaksessubjectdan melemparkan kesalahan jika akses tidak diizinkan
Saya condong ke arah pilihan empat - Memiliki subjectmengandung accessControllerlapangan, di mana panggilan untuk subject.userMayAccess(User user)mendelegasikan operasi a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. tapi kemudian ini menimbulkan pertanyaan lebih lanjut:
- haruskah
accessControllerbidang vs kelas statis ..? - Haruskah
subjectmengetahui izin apa yang diperlukan untuk dapat melihatnya? - di mana asas paling sedikit ilmu berperan di sini, sehubungan dengan pemanggilan
subject.display()? Haruskah peneleponsubject.display()mengetahui bahwa kontrol akses berlaku? (di manasubject.display()"metode templat" terakhir) - telah
subject.display()mengelola kontrol akses, melemparkan pengecualian di mana pengguna tidak memiliki izin yang diperlukan?
Apa yang akan dianggap "praktik terbaik" dalam situasi ini? Di mana seharusnya tanggung jawab untuk melakukan pemeriksaan sebenarnya terjadi?
Karena ini merupakan latihan akademis yang kemudian akan berkembang menjadi implementasi, referensi untuk pola desain akan dihargai.