2008-08-04 104 views
17

我經常遇到以下情況,我需要提供許多不同類型的權限。我主要使用ASP.NET/VB.NET與SQL Server 2000處理多種權限類型的最佳方法是什麼?

方案

我想提供一個動態的權限系統,可以在不同的參數工作。假設我想給一個部門或只是一個特定的人訪問一個應用程序。並假裝我們有一些不斷增長的應用程序。

在過去,我選擇了以下兩種方式之一,我知道這樣做。

1)使用帶有特殊列的單個權限表,用於確定如何應用參數。本例中的特殊列是TypeID和TypeAuxID。 SQL看起來像這樣。

SELECT COUNT(PermissionID) 
FROM application_permissions 
WHERE 
(TypeID = 1 AND TypeAuxID = @UserID) OR 
(TypeID = 2 AND TypeAuxID = @DepartmentID) 
AND ApplicationID = 1 

2)使用的映射表的每個類型的權限,然後將它們連接在一起。

SELECT COUNT(perm.PermissionID) 
FROM application_permissions perm 
LEFT JOIN application_UserPermissions emp 
ON perm.ApplicationID = emp.ApplicationID 
LEFT JOIN application_DepartmentPermissions dept 
ON perm.ApplicationID = dept.ApplicationID 
WHERE [email protected] 
    AND ([email protected] OR [email protected] OR 
(emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1 
ORDER BY q.QID ASC 

我的思想

我希望的例子是有意義的。我把它們拼湊在一起。

第一個例子需要較少的工作,但他們都不覺得最好的答案。有沒有更好的方法來處理這個問題?

回答

10

我同意約翰唐尼。

個人而言,我有時會使用標記的權限枚舉。通過這種方式,您可以對枚舉項目使用AND,OR,NOT和XOR按位操作。

"[Flags] 
public enum Permission 
{ 
    VIEWUSERS = 1, // 2^0 // 0000 0001 
    EDITUSERS = 2, // 2^1 // 0000 0010 
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100 
    EDITPRODUCTS = 8, // 2^3 // 0000 1000 
    VIEWCLIENTS = 16, // 2^4 // 0001 0000 
    EDITCLIENTS = 32, // 2^5 // 0010 0000 
    DELETECLIENTS = 64, // 2^6 // 0100 0000 
}" 

然後,你可以結合使用AND位運算符的幾個權限。

例如,如果一個用戶可以查看&編輯的用戶,操作的二進制結果爲0000 0011其轉換爲十進制爲3
可以將一個用戶的許可,則存儲到數據庫中的單個柱(在我們的情況下它會是3)。

在您的應用程序中,您只需要另一個按位操作(OR)來驗證用戶是否具有特定權限。

+1

我用這種方法發現的問題是,使用這種方法很容易耗盡角色。正如你所看到的,6個角色的值爲2^6 = 64,當31個角色將有2^31 = 2,147,483,647這是最大的int值。所以在T-SQL中,可以使用的最大數據類型是bigint(2^63)。當然你可以使用varchar類型,但是當我有很多角色時,我更喜歡使用John Downey的解決方案。 – 2011-10-07 00:47:08

10

我通常關於編碼權限系統的方式是有6個表格。

  • 用戶 - 這是相當直截了當它是典型的用戶表
  • 組 - 這將是同義的部門
  • 角色 - 這是所有權限通常也包括人類可讀的名稱表和說明
  • Users_have_Groups - 這是一個什麼樣組的用戶屬於
  • Users_have_Roles一個多到多表 - 什麼角色都分配給單個用戶的另一個多到多臺
  • 個Groups_have_Roles - 什麼樣的角色最後許多一對多表中的每個組都有

在你運行翻出每一個他們已經分配的角色一些邏輯用戶會話的開始,無論是目錄或通過組。然後你將這些角色編碼爲安全權限。

就像我說的這是我通常做的,但是你的米勒可能會有所不同。

0

我在各種應用程序中使用的方法是有一個通用的PermissionToken類,它具有可更改的Value屬性。然後,您查詢請求的應用程序,它會告訴您需要哪些PermissionTokens才能使用它。

例如,運輸應用可能會告訴你,它需要:

new PermissionToken() 
{ 
    Target = PermissionTokenTarget.Application, 
    Action = PermissionTokenAction.View, 
    Value = "ShippingApp" 
}; 

這顯然可以擴展到創建,編輯,刪除等,並,因爲自定義Value屬性,任何應用程序,模塊或部件的可以定義自己所需的權限。 YMMV,但這對我來說一直是一種有效的方法,而且我發現它的規模很好。

2

除了John Downey和jdecuyper的解決方案之外,我還在位域的末尾添加了一個「Explicit Deny」位,以便您可以通過組,角色成員身份執行附加權限,然後減去權限基於明確的拒絕條目,非常像NTFS的工作,權限明智。

2

老實說,ASP.NET Membership/Roles功能對於你描述的場景來說是完美的。編寫你自己的tables/procs/classes是一個很好的練習,你可以很好地控制一些細節,但自己做完這些之後,我總結出最好只使用內置的.NET。很多現有的代碼都是爲了解決這個問題而設計的,它很好。從頭開始寫了大約2周的時間,並沒有像.NET那樣健壯。你必須編寫如此多的廢話(密碼恢復,自動鎖定,加密,角色,許可界面,噸過程等),時間可以更好地花在其他地方。

對不起,如果我沒有回答你的問題,我就像那個人說誰學習c#時,有人問一個vb問題。

相關問題