2009-08-05 8 views
1

Arrière-plan Chaque projet a un compte auquel il est associé. Chaque utilisateur peut avoir l'autorisation d'accéder à zéro à plusieurs comptes. Cela signifie que chaque utilisateur peut uniquement accéder à un sous-ensemble de projets en fonction des autorisations du compte de l'utilisateur.Autorisation de modèle objet - OO Design Question

L'objet Utilisateur est chargé lorsque l'utilisateur se connecte à l'application et que les autorisations de compte sont également chargées à ce stade. Cet objet Utilisateur est stocké dans le cache de l'application. Les projets sont chargés en fonction des besoins.

Question Quelle est la meilleure façon d'appliquer les limitations de compte? Nous souhaitons qu'il soit extrait de la logique de présentation réelle, mais nous ne pensons pas que ce soit nécessairement une bonne approche pour placer la logique d'autorisation dans l'objet Project, car cela dépend de l'objet User. Qu'en pensez-vous?

Exemple: (ASPX code de la page derrière)

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

Répondre

1

Puis abstraire l'objet utilisateur également. Transformez les objets utilisateur en une collection d'autorisations que vous pouvez interroger à l'aide d'une interface standard des projets.

+0

Alors, est-ce que je passerais l'objet utilisateur dans l'objet projet? –

+1

Indirectement, via son interface. Dans cette solution, vous ne pourrez pas contourner le fait que les projets et les utilisateurs sont au courant de cette interface, mais le projet n'a pas besoin de savoir s'il est en train de parler à un utilisateur, à TestHarness ou à – DanDan

1

Vous pouvez implémenter une classe responsable de la validation des autorisations sur le projet (c'est-à-dire que la logique de vérification des autorisations ne se trouve pas dans le projet); par exemple. En Java:

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

Puis dans votre code vous suffit d'ajouter des appels à checkProjectPermission à la couche d'affaires avant de passer les résultats à votre couche de présentation. Certes, il s'agit d'une approche assez procédurale (c'est-à-dire non-OO), mais il est clair que toute logique basée sur les permissions est dans une classe. L'approche basée sur les exceptions signifie également moins d'instructions if-then dans votre code.

+0

pages qui chargent le projet, et dans une page l'utilisateur devrait être autorisé à charger le projet, mais dans un autre l'utilisateur ne devrait pas être autorisé à charger le projet? –