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 userve bir subjecto usereriş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
subjectolduğu izinlerin listesiyle sorgulayınuser-subject.allowAccess(user.getPermissionSet) - Gerektiren
userizinlerin 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ışınsubjectve bir hata atın.
Ben dört seçenek doğru eğilerek - a la operasyonu temsilci çağırmak için subjectbir accessControlleralan 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:
accessControllerbir alan vs statik bir sınıf olmalı ..?- Görebilmek için hangi izinlerin gerekli olduğunu
subjectbilmeli 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.