2011-09-05 67 views
5

創建/刪除角色時,我不想修改代碼。如何使用角色(asp.net)而不對其進行硬編碼?

if (HttpContext.Current.User.IsInRole("Super Admin") || 
    HttpContext.Current.User.IsInRole("Admin") || 
    HttpContext.Current.User.IsInRole("Support")) 
{ 
    if (HttpContext.Current.User.IsInRole("Admin")) 
    { 
     ListBox1.DataSource = Roles.GetAllRoles().Except(
      new[] { "Super Admin" }); 

    } 
    if (HttpContext.Current.User.IsInRole("Support")) 
    { 
     ListBox1.DataSource = Roles.GetAllRoles().Except(
      new[] { "Super Admin", "Admin" }); 
    } 
    fillDropDownCustomers(); 
} 

回答

2

角色通過爲用戶可以執行的操作指定值來工作。角色不會改變,但這些角色的行爲確實如此。超動態解決方案往往是矯枉過正的。

因此,也許你有下列角色

  • 超級管理員
  • 支持
  • 聯繫

你可以有不同的操作(這將取決於您的系統)

  • 查看
  • 編輯
  • 批准

  • 超級管理員[查看,編輯,覈准]
  • 支持[查看]
  • 管理員[查看,編輯]

動態部分來自動作的分配。以這種方式做事,你不在乎某人在什麼角色,但他們有什麼行爲。行動是這種關係中的動態方面。當一個請求時,將使用用戶角色來獲取指定的操作給該角色(數據庫驅動,使修改)

納入到這個數據庫結構「角色有很多動作」,是指如果事情在未來發生變化,您將需要更新數據庫中的關係,但不包括代碼。

數據庫結構可能看起來像這樣,取決於您的需求。

  • 的UserRole [ID,用戶名,角色ID(如果用戶被分配它們繼承的所有操作,這可能會被複制,因此選擇DISTINCT或避免這種情況不止一個角色,但我相信前者提供了更大的靈活性,而不復雜性和侷限性注意:UserRole表可以進一步非規範化以使UserNames具有唯一性。)
  • 作用[ID,名稱]
  • 操作[ID,名稱]
  • RoleAction [ID,角色ID,ActionID](唯一鍵約束上角色ID和ActionID)

當做出請求時,則識別用戶等用戶名,然後鍛鍊其中角色(S)它們在由quering的RoleAction並由此加載其相關聯操作

我會用枚舉您的行動和角色值。這使得它更容易處理。爲了確保數據庫和代碼處於接收狀態,請確保您編寫單元測試來對照枚舉值調整數據庫值。

+0

我認爲如果沒有使用其他答案所建議的常量,那麼這仍然需要將角色硬編碼到代碼中。 –

+0

這是肯定的,但是如問題中所闡述的那樣使用角色還沒有很好理解,因此當角色實際上是動態的行爲時,他們希望將角色擴展爲動態的。 – Jonathan

+1

非常感謝這個答案。這是非常有用的,因爲我在每個需要執行操作的單個部分中啓用/禁用用戶,而不是向數據庫詢問他們是否有能力。然而,我仍然想知道如果一個特定的用戶能夠創建特定的記錄但不是所有的記錄會發生什麼情況:創建一個名爲「創建」的動作不是最有效的解決方案嗎?我是否必須在表格Actions和其他表格之間創建關係?非常感謝你的幫助! – aleafonso

4

把那些值靜態類:

public static class MyRoles 
{ 
    public const string Admin = "Admin"; 
    public const string SuperAdmin = "Super Admin"; 
    public const string Support = "Support"; 
} 

現在,您可以重新使用它們像這樣:

if (HttpContext.Current.User.IsInRole(MyRoles.SuperAdmin) || 
    HttpContext.Current.User.IsInRole(MyRoles.Admin) || 
    HttpContext.Current.User.IsInRole(MyRoles.Support)) 
{ 
0

答案很簡單,使用的常量。更多的上下文答案是使用IoC將邏輯推送到另一個類中,您可以在其中管理配置或數據庫的關係。

0

正如其他答案所建議的那樣,作爲常量變量。但是,如果要更改其中一個角色的名稱,您仍然需要更改代碼並重新發布。

另一種選擇是將角色的名稱添加到配置文件中。您將使用應用程序設置或從ConfigurationSection繼承的自定義配置類。看看這裏的如何http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

這樣你可以改變web.config文件中的角色的名稱,你不必更新任何代碼或重新發布項目。

相關問題