Patrzę na projekt interfejsu i staram się zdecydować, który jest najbardziej „prawidłowym” sposobem wdrożenia kontroli dostępu opartej na rolach, biorąc pod uwagę useri subject, do userktórego chciałby uzyskać dostęp.
Z tego co widzę, mam trzy podstawowe opcje (czwarta to zlekceważenie pierwszych trzech, a piąta poprawa czwartej):
- Zapytaj
subjecto listę uprawnień, któreuserma -subject.allowAccess(user.getPermissionSet) - Zapytaj
usero listę uprawnień, któresubjectwymagają -user.hasPermissionTo(subject.getRequiredPermissions()) - Zapytaj firmę zewnętrzną, aby zlokalizować skrzyżowania uprawnień -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Zapytaj albo
subject/user, delegując „decyzję” do klasy innej firmy - Spróbuj
useruzyskać dostępsubjecti wyrzucić błąd, jeśli dostęp nie jest dozwolony
Przechylam się do opcji czwartej - Niech subjectzawiera accessControllerpole, w którym połączenia subject.userMayAccess(User user)delegują operację a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. ale to rodzi kolejne pytania:
- czy pole powinno
accessControllerbyć polem a klasą statyczną? - Czy należy
subjectwiedzieć, jakie uprawnienia są wymagane, aby móc go wyświetlić? - gdzie w grę wchodzi zasada najmniejszej wiedzy w odniesieniu do powołania
subject.display()? Czy osoby dzwoniące powinnysubject.display()wiedzieć, że obowiązuje kontrola dostępu? (gdziesubject.display()jest ostatnia „metoda szablonu”) - mają
subject.display()zarządzać kontrolą dostępu, rzuca wyjątek, jeśli użytkownik nie posiada wymaganego pozwolenia?
Co byłoby uważane za „najlepszą praktykę” w tej sytuacji? Gdzie faktycznie powinna wystąpić odpowiedzialność za przeprowadzanie kontroli?
Ponieważ jest to w pewnym stopniu zarówno ćwiczenie akademickie, które następnie przejdzie do wdrożenia, mile widziane będą odniesienia do wzorców projektowych.