2012-10-03 58 views
4

我需要通過角色來過濾用戶,而且所有用戶屬於兩個角色如何檢查是否只有一個角色匹配?

例子:AdminGroup1一個用戶,並UserGroup1爲其他。

現在我想過濾他們Group1角色和忽略AdminUser

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 
        }); 
} 

這並沒有出錯,但顯示爲空。我想我知道爲什麼,但還是無法弄清楚如何去解決它...

+0

Roles.GetRolesForUser(x.UserName) - 這會返回什麼類型? – Sruti

+0

'string []'抱歉忘了提及那個。 – rexdefuror

+0

它看起來像一個編譯錯誤,包含在一個數組不包含數組作爲其參數! – Sruti

回答

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

我知道這樣做可行,但我需要將'OtherGroup',又名'Group1'作爲動態例子,因爲它不會是 – rexdefuror

+0

什麼是決定角色過濾器的邏輯?你是否會在後期將它傳遞給你的索引操作方法? – tranceporter

+0

Errm ..這不是什麼「邏輯」,但看看問題,你會在方法開始時看到字符串的混亂,應該是「角色過濾器」,雖然我很尷尬地稱它爲> _> – rexdefuror

2

好了,在這裏不言而喻。我對你的問題的理解是,你想檢查用戶是否有一個或多個特定的角色。如果是這樣,請允許訪問;否則,拒絕他們訪問並將他們發送到黑洞。這聽起來像你的例子,你只想檢查一個特定的角色。讀一些你的評論,你可能也想在某個時候檢查多個角色。我將向您展示的代碼示例允許您針對用戶必須分配到的一組或多個角色來檢查用戶,以便訪問該頁面。

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. 
} 

這裏的想法是獲取所有必需角色的列表並減去用戶分配給他或她的所有角色。如果減法後列表中還有任何角色,則用戶不具備所有必需的角色。這裏有一些例子。授權所需的角色位於減號的左側,而用戶的指定角色位於減號的右側,就像上面的代碼一樣。

用戶真棒,煎餅,所以他們被允許訪問。請注意,我們結束了一個空集,這意味着用戶是否滿足要求:

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

用戶只是一個煎餅。他們不允許訪問。結果集包含「真棒」,這樣意味着他們缺少了「真棒」的角色:

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

這個用戶是不是真棒或煎餅,但她是一個管理員。然而,我們要求真棒煎餅才能進入頁面,以便該用戶將被拒絕訪問:

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

如果您有任何疑問或這是不是你想要的,請發表評論。如果需要,我很樂意幫助你。

+0

抱歉,不同的時區,我正在睡覺。將嘗試。行! – rexdefuror

+0

行! tranceporters解決方案正是我所需要的,但你的(不知不覺)解決了我的其他問題與應用程序的不同部分!所以+和謝謝! :d – rexdefuror

相關問題