J'examine la conception de mon interface et j'ai du mal à décider quelle est la façon la plus "correcte" d'implémenter le contrôle d'accès basé sur les rôles, étant donné un useret un subjectauxquels userils aimeraient accéder.
Pour autant que je puisse voir, j'ai trois options de base (avec une quatrième étant une bâtardisation des trois premiers et une cinquième étant un ajustement du quatrième):
- Recherchez le
subjectavec une liste d'autorisations que leusera -subject.allowAccess(user.getPermissionSet) - Recherchez le
useravec une liste d'autorisations que lesubjectrequiert -user.hasPermissionTo(subject.getRequiredPermissions()) - Interrogez un tiers pour localiser les intersections des autorisations -
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) - Interrogez le
subject/usertout en déléguant la "décision" à une classe tierce - Avoir la
usertentative d'accéder àsubjectet lancer une erreur si l'accès n'est pas autorisé
Je me penche vers l'option quatre - Avoir le subjectcontient un accessControllerchamp, où les appels à subject.userMayAccess(User user)déléguer l'opération à la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
.. mais cela soulève d'autres questions:
- devrait
accessControllerêtre un champ vs une classe statique ..? - Faut-il
subjectsavoir quelles autorisations sont nécessaires pour pouvoir le voir? - où le principe de moindre connaissance entre-t-il en jeu ici, en ce qui concerne l'appel
subject.display()? Les appelants devraient-ilssubject.display()savoir que le contrôle d'accès est en vigueur? (où sesubject.display()trouve une "méthode modèle" finale) - avoir
subject.display()gérer le contrôle d'accès, levant une exception où l'utilisateur n'a pas l'autorisation requise?
Quelle serait la «meilleure pratique» dans cette situation? Où la responsabilité d'effectuer les contrôles devrait-elle réellement se produire?
Comme il s'agit en quelque sorte d'un exercice académique qui progressera ensuite dans la mise en œuvre, des références aux modèles de conception seraient appréciées.