2009-09-21 16 views
0

J'ai plusieurs modèles, pour lesquels je veux montrer quelques icônes communes pour les liens d'action (nouveaux, détails, éditer, supprimer) et certains spécifiques pour certains modèles seulement; ces icônes ne doivent apparaître que lorsque l'utilisateur a l'autorisation d'effectuer l'action. Les permissions sont décidées par les rôles, mais je voudrais les résumer, de sorte que les rôles explicites nécessaires soient écrits en un seul endroit. Je voudrais également utiliser la même logique pour afficher des icônes et pour "protéger" les méthodes d'action, de sorte que si le rôle Foo était nécessaire pour éditer lolcatz, et maintenant je veux le changer pour le rôle Bar, je seulement avoir à changer une chose.autorisations sensibles (icône) liens d'action pour tous les modèles: comment?

Il y a plusieurs façons de l'implémenter, et je ne suis pas sûr de la marche à suivre.

Je pourrais écrire une classe ModelAction, responsable de décider des permissions, lien, icône, texte pour une seule action, et quelques ModelActionsCollection pour rassembler toutes les actions possibles pour un seul modèle, afin que je puisse écrire une classe parent et plusieurs descendant ceux

Mes doutes:

  • comment dois-je associer des modèles avec ModelActionsCollection? Dois-je utiliser un hachage ou une classe statique, comme SomeStaticClass.GetModelActionsCollection(someModel)? ou typeof(someModel), ou "className" ou quoi?

  • comment devrais-je décorer les méthodes? devrais-je écrire quelque chose comme:

    [MyAuthorize("action", "model")] 
    public ActionResult action(...) 
    

    ou autre chose?

  • est-il acceptable d'accéder à l'utilisateur authentifié actuel directement dans les méthodes de ces classes, ou devraient-ils recevoir l'utilisateur en tant que paramètre?

  • Quel espace de noms appartiennent à cette classe? sont-ils des modèles? aides? ou quoi?

  • et, enfin: quelqu'un a-t-il déjà fait tout cela de manière réutilisable?

Répondre

0

nous faisons exactement ce

décorez votre action avec un type d'autorisation drapeau et une chaîne de l'icône dans par exemple css [ActionModelPermission (typeof (ContactModel), PermissionTypes.Create | PermissionTypes.Edit, "typeIcon typeContact")]

Le ActionModelPermission, PermissionTypes et ContactModel sont toutes les classes de notre projet.

Ensuite, nous avons notre propre aide ActionLink qui trouve la méthode à partir d'un lambda fourni et effectue la vérification d'autorisation, et construit le lien avec la classe CSS appropriée sur elle

+0

Ok, donc, où initialisez-vous tous actionmodelpermissions? directement dans les contrôleurs, dans Application_Start ou où? – giorgian

+0

Lorsque le lien est rendu, je reflète l'action pour obtenir l'attribut d'autorisation ActionModelPermission cela me dit les autorisations requises pour le lien et la classe css à utiliser sur le html rendu. Je vérifie ensuite les permissions actuelles des utilisateurs qui sont mises en cache dans ViewData pour voir si l'autorisation requise est donnée –

Questions connexes