Benim arayüz tasarımı bakıyorum ve ben rol tabanlı erişim denetimi sağlamak en "doğru" yolu olan karar mücadele ediyorum, verilen user
ve bir subject
o user
erişime istiyorum.
Görebildiğim kadarıyla üç temel seçeneğim var (dördüncüsü ilk üçün piç haline getirilmesi ve beşinci dördün bir tweak olması):
- Sahip
subject
olduğu izinlerin listesiyle sorgulayınuser
-subject.allowAccess(user.getPermissionSet)
- Gerektiren
user
izinlerin bir listesini sorgulayınsubject
-user.hasPermissionTo(subject.getRequiredPermissions())
- İzinlerin kesişim noktalarını bulmak için bir üçüncü tarafı sorgulayın -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
- Sorgu ya
subject
/user
, bir üçüncü taraf sınıfına "karar" devrederek ise - Erişime izin verilmiyorsa erişmeye
user
çalışınsubject
ve bir hata atın.
Ben dört seçenek doğru eğilerek - a la operasyonu temsilci çağırmak için subject
bir accessController
alan içerir subject.userMayAccess(User user)
:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. ancak daha sonra başka sorular ortaya çıkıyor:
accessController
bir alan vs statik bir sınıf olmalı ..?- Görebilmek için hangi izinlerin gerekli olduğunu
subject
bilmeli misiniz? - Arama ile ilgili olarak burada en az bilgi ilkesi nerede devreye girer
subject.display()
? Arayanlarsubject.display()
erişim kontrolünün yürürlükte olduğunu bilmeli midir? (subject.display()
son bir "şablon yöntemi" nerede ) - gelmiş
subject.display()
kullanıcı gerekli izni yok istisna atan, erişim kontrolü yönetmek?
Bu durumda ne "en iyi uygulama" olarak kabul edilir? Kontrolleri yapma sorumluluğu gerçekte nerede oluşmalıdır?
Bu bir şekilde hem daha sonra uygulamaya geçecek olan akademik bir alıştırma olduğundan, tasarım modellerine referanslar takdir edilecektir.