Comment créer une vue avec différents affichages en fonction du rôle de l'utilisateur?

StackOverflow https://stackoverflow.com/questions/409213

  •  03-07-2019
  •  | 
  •  

Question

Je souhaite créer une vue comportant différents affichages en fonction du rôle de l'utilisateur.

Devrais-je créer une vue différente pour différents rôles ou devrais-je vérifier les rôles sur la page Veiw elle-même plutôt que dans les actions?

Comment vérifier le rôle sur la page d'affichage?

Était-ce utile?

La solution

  

Ou devrais-je utiliser vérifier les rôles sur le   Veiw page elle-même plutôt que sur   actions, si oui quelqu'un peut-il me montrer   comment vérifier cela sur la page de vue

Vous devez faire les deux. Vérifiez les rôles sur les actions en tant que mesure de sécurité et vérifiez les rôles dans les vues pour activer / désactiver des contrôles spécifiques.

Dans votre page d'affichage, la forme longue de vérification d'un rôle est

.
HttpContext.Current.User.IsInRole("Administrator")

De nombreux développeurs créeront des méthodes d'aide aux pages afin que vous puissiez obtenir quelque chose de plus concis pour votre application, comme

.
public static bool IsAdmin(this ViewUserControl pg)
{
    return pg.Page.User.IsInRole("Administrator")
}

alors dans votre vue, vous pouvez simplement utiliser this.IsAdmin ()

Pour ne pas encombrer votre vue, utilisez des vues partielles

<% if (IsAdmin())
   {
      Html.RenderPartial("AdminPanel");
   }
   else
   {
      Html.RenderPartial("UserPanel");
   }
%>

Autres conseils

Si l'affichage change en fonction du rôle - et que le changement est petit - alors je ferais la vérification dans la vue. Si certaines vues sont restreintes en fonction du rôle, je ferais la vérification dans le contrôleur. Si les points de vue sont complètement différents (ce serait difficile à imaginer), des points de vue distincts par rôle peuvent être appropriés.

Vous pouvez éventuellement extraire certains composants de vue spécifiques à un rôle en vues partielles pour simplifier la logique de votre vue. En gros, il vous suffit de vérifier pour inclure la vue partielle ou non en fonction du rôle.

De plus, outre le fait de vérifier "IsAuthenticated", je déplacerais la logique de vérification du rôle vers le contrôleur et transmettrais (en tant que données) à la vue des informations sur les éléments à inclure / exclure en fonction du rôle. Cela empêche la logique métier réelle de déborder dans votre vue.

Si vous utilisez MVC, le développement consiste à garder la logique hors de la vue et dans le contrôleur. Il me semble que vous seriez mieux placé sur une piste de développement WebForms que sur une piste MVC.

Cela étant dit, je vérifie plusieurs de mes pages en utilisant un chèque comme celui-ci:

<% if ((bool)ViewData["Admin"]) { %>
    <!-- Show admin controls here -->
<% } %>

Mais si vous essayez de créer une logique réelle dans la vue, vous devez déterminer ce que vous pouvez envoyer au contrôleur pour qu'il effectue le travail. La vue doit être aussi bête que possible, en agissant sur les indicateurs qui lui sont envoyés.

sans rechercher le mécanisme exact utilisé par asp.net mvc pour les rôles, je voudrais crier non pour avoir placé votre logique d’entreprise dans la vue, ce que vous faites si vous vérifiez les rôles dans la vue

Oui, c'était quelque chose qui me dérangeait également ... mais en même temps, il me semblait ridicule de charger une vue complètement différente pour un changement aussi modeste.

d'ailleurs comment avez-vous mis cela en place dans votre contrôleur. Pour le moment, mon contrôleur ressemble au code ci-dessous, ce qui, à mon avis, n’est pas correct.

[Authorize(Roles = "Admin, Member")]
public ActionResult RegistrationInformation()
{

    return View();
}

Je ne connais pas encore très bien ASP.NET MVC, mais ne pouvez-vous pas créer une sorte de filtre conditionnel dans la vue? Si le contrôleur transmet le rôle à la vue, vous devriez pouvoir effectuer un filtre conditionnel et afficher un certain bloc de code si l'utilisateur est un administrateur. Si vous souhaitez afficher une page totalement distincte, vous disposez de plusieurs vues. Sinon, vous pouvez en utiliser une et procéder à certaines conditionnelles.

Sous Ruby on Rails, cela ressemblerait à quelque chose du genre (désolé, je ne connais pas encore vraiment ASP.NET MVC):

<% if @user.admin? # is the user an admin %>
  <h3>Admin Tools</h3>
<% end %>
<p>Regular site content</p>

Dans Rails, vous devriez charger le contenu supplémentaire à partir de partiels. ASP.NET MVC a quelque chose de similaire mais j'oublie comment il s'appelle. Peut-être examiner cela?

Désolé, je ne peux pas vous aider davantage, comme je l'ai dit, je n'ai pas vraiment appris à jouer avec ASP.NET MVC.

J'ai un modèle de base qui s'étend de tous les autres modèles. Dans ce modèle, j'ai chargé les rôles de l'utilisateur. Son basé sur la méthode httpcontext.user.isinrole (). Toutes les vues sont fortement typées et attendent le type de modèle de base. Je peux donc toujours vérifier dans toutes les vues quelque chose comme Model.CurrentUser.IsInRoles (Role1 | Role2). Non seulement dans les vues, bien sûr, mais dans les trous.

J'aime avoir le plein contrôle de cela dans la vue, et je trouve que:

<% if (User.IsInRole("Super User")) { %>
    <h1>Hello world!</h1>
<% } %>

Fonctionne pour la plupart des scénarios. Il vous permet également d’effectuer facilement une mise en forme conditionnelle pour d’autres rôles, par exemple "Gestionnaire de contenu", "Enregistré", etc.

J'aime bien la réponse de Todd Smith, car vous pourriez changer le nom du rôle Admin, ce qui ne nécessitera qu'un changement, alors que, si vous définissez l'option "Super utilisateur". ou " Administrateur " chaîne directement dans la vue, vous devrez la changer partout où vous avez utilisé la valeur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top