2012-10-03 2 views
4

J'ai besoin de filtrer les utilisateurs par rôles, mais tous les utilisateurs appartiennent à deux rôlesComment vérifier si un seul rôle correspond?

Exemple: Admin et Group1 pour un utilisateur, et User et Group1 pour l'autre. Maintenant je veux les filtrer par Group1 Rôle et ignorer Admin et User.

public ViewResult Index() 
{ 
    string[] roles = Roles.GetRolesForUser(); 
    var group = string.Join(" ", roles); 
    group = group.Replace("Admin", "");//Used this to single out Group1 from Admin user 
    return View(new UserViewModel 
        { 
         Users = _userService.FindAll().Where(x => Roles.GetRolesForUser(x.UserName).Contains(group)), 
         Roles = roles 
        }); 
} 

Ceci ne génère pas d'erreur mais indique qu'elle est vide. Je pense que je sais pourquoi mais ne peut toujours pas comprendre comment le contourner ...

+0

Rôles.GetRolesForUser (x.UserName) - Quel type renvoie-t-il? – Sruti

+0

'string []' Désolé d'avoir oublié de le mentionner. – rexdefuror

+0

Il ressemble à une erreur de compilation, Contient sur un tableau ne prend pas un tableau comme paramètre! – Sruti

Répondre

2
public ViewResult Index() 
{ 
    var roleFilter = Roles.GetRolesForUser().First(r => !r.equals("Admin")); 

    return View(new UserViewModel 
       { 
        Users = _userService.FindAll().Where(x => Roles.GetRolesForUser(x.UserName).Contains(roleFilter)), 
        Roles = new [] {roleFilter} 
       }); 
} 
+0

Je sais que cela fonctionnera, mais je dois avoir ce 'OtherGroup', alias 'Group1' dans l'exemple dynamique, parce que ce ne sera pas le – rexdefuror

+0

Quelle est la logique pour décider du filtre de rôle? Allez-vous le transmettre à votre méthode d'action d'index sur le poste? – tranceporter

+0

Errm .. Ce n'est pas beaucoup d'une «logique», mais jetez un oeil à la question, vous verrez le déconner avec les chaînes au début de la méthode, cela devrait être "filtre de rôle" bien que je sois gêné de l'appeler cela> _> – rexdefuror

2

Bon, ici il va. Ma compréhension de votre problème est que vous voulez vérifier si l'utilisateur a un ou plusieurs rôles spécifiques. Si oui, autorisez l'accès; sinon, leur refuser l'accès et les envoyer dans un trou noir. Dans votre exemple, il semble que vous souhaitiez uniquement vérifier un rôle spécifique. En lisant certains de vos commentaires, vous pouvez également vérifier plusieurs rôles à un moment donné. L'exemple de code que je vais vous montrer vous permet de vérifier un utilisateur par rapport à un ensemble d'un ou plusieurs rôles auxquels l'utilisateur doit être affecté pour accéder à la page.

string[] requiredRoles = new string[] { "Awesome", "Pancake" }; 
if (requiredRoles.Except(theUsersAssignedRoles).Any()) 
{ 
    // Authorization has failed! 
    // The user is not awesome and they are not a pancake. 
} 
else 
{ 
    // User is awesome and a pancake so let them through. 
} 

L'idée ici est de prendre une liste de tous les rôles nécessaires et soustrayez tous les rôles que l'utilisateur a assigné à lui. S'il reste des rôles dans la liste après la soustraction, l'utilisateur ne dispose pas de tous les rôles requis. Voici quelques exemples. Les rôles requis pour l'autorisation se trouvent à gauche du signe de soustraction alors que les rôles attribués à l'utilisateur se trouvent à droite du signe de soustraction, tout comme le code ci-dessus.

L'utilisateur est génial et une crêpe afin qu'ils soient autorisés à accéder. Remarquez que nous finissons avec un ensemble vide qui signifie que l'utilisateur répond aux exigences:

{ "Awesome", "Pancake" } - { "Awesome", "Pancake" } = { } 

L'utilisateur est seulement une crêpe. Ils ne sont pas autorisés à accéder. L'ensemble résultant contient rôle « Impressionnant » ce qui signifie qu'ils manquent le « Impressionnant »:

{ "Awesome", "Pancake" } - { "Pancake" } = { "Awesome" } 

Cet utilisateur est génial ou pas une crêpe mais elle est un administrateur. Pourtant, nous avons besoin des crêpes impressionnants pour entrer dans la page afin que cet utilisateur est refusé l'accès:

{ "Awesome", "Pancake" } - { "Admin" } = { "Awesome", "Pancake" } 

Si vous avez des questions ou ce n'est pas ce que vous voulez, s'il vous plaît laisser un commentaire. Je serai heureux de vous aider plus loin si nécessaire.

+0

Désolé, différents fuseaux horaires, je dormais. Je vais essayer ça. – rexdefuror

+0

OK! La solution de Tranceporters était exactement ce dont j'avais besoin, mais la vôtre (sans le savoir) a résolu mon autre problème avec différentes parties de l'application! Donc + et MERCI !!! :RÉ – rexdefuror

Questions connexes