2009-08-05 16 views
1

Hintergrund Jedes Projekt hat ein Konto, mit dem es verknüpft ist. Jeder Benutzer kann die Berechtigung haben, auf null bis viele Konten zuzugreifen. Dies wiederum bedeutet, dass jeder Benutzer nur auf eine Untergruppe von Projekten basierend auf den Benutzerkontoberechtigungen zugreifen kann.Objektmodell Autorisierung - OO Design Frage

Das Benutzerobjekt wird geladen, wenn sich der Benutzer bei der Anwendung anmeldet, und die Kontoberechtigungen werden zu diesem Zeitpunkt ebenfalls geladen. Dieses Benutzerobjekt wird im Cache der Anwendung gespeichert. Projekte werden nach Bedarf geladen.

Frage Wie können Kontobeschränkungen am besten durchgesetzt werden? Wir möchten, dass es von der eigentlichen Präsentationslogik abstrahiert wird, aber wir denken nicht, dass es unbedingt ein guter Ansatz ist, die Autorisierungslogik in das Projektobjekt zu stellen, da es dann vom Benutzerobjekt abhängt. Was denkt ihr?

Beispiel: (aspx Seite Code hinter)

Project oProject = New Project(projectId); //Pass an Int32 here 
if (oProject.Load()) //This operation needs to check user permissions somehow 
{ /* Do stuff */ } 

Antwort

1

Dann abstrahieren auch das Benutzerobjekt. Verwandeln Sie Benutzerobjekte in eine Sammlung von Berechtigungen, die Sie über eine Standardschnittstelle aus den Projekten abfragen können.

+0

Also würde ich das Benutzerobjekt in das Projektobjekt übergeben? –

+1

Indirekt über seine Schnittstelle. In dieser Lösung werden Sie nicht in der Lage sein, die Tatsache zu umgehen, dass Projekte und Benutzer über diese Schnittstelle Bescheid wissen, aber das Projekt nicht wissen muss, ob es mit einem Benutzer oder einer TestHarness usw. kommuniziert. – DanDan

1

Sie könnten eine Klasse implementieren, die für die Validierung von Berechtigungen für das Projekt verantwortlich ist (d. H. Würde die Berechtigungsüberprüfungslogik außerhalb des Projekts ausgeführt werden); z.B. In Java:

public interface EntitlementsManager { 
    void checkProjectPermission(String userName, int projectId) throws SecurityException; 
} 

dann in Ihrem Code fügen Sie einfach Anrufe checkProjectPermission bei der Business-Schicht, bevor die Ergebnisse zurück zu Ihrer Präsentationsschicht übergeben. Zugegeben, dies ist ein ziemlich prozeduraler (d. H. Nicht-OO) Ansatz, aber es ist klar zu folgen, da all Ihre Erlaubnis basierte Logik in einer Klasse ist. Der ausnahmebasierte Ansatz bedeutet auch weniger Wenn-Dann-Anweisungen in Ihrem Code.

+0

Was ist, wenn es mehrere gibt? Seiten, die das Projekt laden, und auf einer Seite sollte der Benutzer berechtigt sein, das Projekt zu laden, aber in einem anderen sollte der Benutzer NICHT berechtigt sein, das Projekt zu laden? –