Ich bin an meinem Interface - Design suchen , und ich kämpfe , um zu entscheiden , welche die „richtige“ Art und Weise ist die rollenbasierte Zugriffssteuerung zu implementieren, einen gegebenen userund ein , subjectdass die für userden Zugriff möchte.
Soweit ich sehen kann, habe ich drei Kernoptionen (wobei eine vierte eine Bastardisierung der ersten drei und eine fünfte eine Optimierung der vierten ist):
- Fragen Sie das
subjectmit einer Liste von Berechtigungen ab, die dasuserhat -subject.allowAccess(user.getPermissionSet) - Fragen Sie die
usermit einer Liste der Berechtigungen ab, diesubjecterforderlich sind -user.hasPermissionTo(subject.getRequiredPermissions()) - Fragen Sie einen Drittanbieter ab, um die Schnittpunkte der Berechtigungen zu ermitteln.
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Fragen Sie entweder das
subject/ abuser, während Sie die "Entscheidung" an eine Drittanbieterklasse delegieren - Haben Sie den
userVersuch , die für den Zugriff aufsubjectund wirft einen Fehler , wenn der Zugriff nicht erlaubt ist
Ich neige zu Option vier - Lassen Sie das Feld subjectenthalten accessController, in dem Aufrufe zum subject.userMayAccess(User user)Delegieren der Operation a la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. aber dann wirft dies weitere Fragen auf:
- sollte das
accessControllerein Feld gegen eine statische Klasse sein ..? - Sollte jemand
subjectwissen, welche Berechtigungen erforderlich sind, um es anzeigen zu können? - Wo kommt hier das Prinzip des geringsten Wissens in Bezug auf die Berufung ins Spiel
subject.display()? Sollten Anrufersubject.display()jemals wissen, dass die Zugriffskontrolle wirksam ist? (Wosubject.display()ist eine endgültige "Vorlagenmethode") - Haben Sie
subject.display()die Zugriffskontrolle verwaltet und eine Ausnahme ausgelöst, bei der der Benutzer nicht über die erforderliche Berechtigung verfügt?
Was würde in dieser Situation als "Best Practice" angesehen? Wo sollte die Verantwortung für die Durchführung der Prüfungen tatsächlich liegen?
Da dies sowohl eine akademische Übung als auch eine Umsetzung ist, sind Verweise auf Entwurfsmuster willkommen.