2011-10-20 45 views
0

一般實施某種形式的基於角色的訪問控制的時候,我們有以下著名的概念:基於角色的訪問控制 - 我應該在db中擁有權限列表還是僅在代碼中擁有權限列表(例如枚舉)?

  • 角色
  • 用戶
  • 權限

而且,用戶將被分配給角色每一個都有一組權限(執行操作/訪問資源等)。 因此,用戶通過分配給一個或多個角色(已分配一組權限)獲得執行操作的權限。

在任何給定的應用程序中,權限是在編譯時定義的,因爲代碼實際上在訪問資源的各個地方強制執行權限。我認爲如果一組可能的權限/操作發生變化 - 它需要改變代碼並以任何方式進行重新編譯,所以在數據庫中查找/引用表不會提供任何超出事實的值一個數據庫管理員可以做一個快速的SQL查詢來列出應用程序使用的所有權限。

然而,我見過的大多數應用程序都爲權限創建了一個查找表,並且 - 也將它映射到代碼中的枚舉。

鑑於此,是否有任何理由實際上有一個數據庫表表示可能的權限列表(除了它可能更容易一些查看數據庫,而不是挖入代碼找到列表/枚舉的權限)?

回答

0

清單: 1)您需要在網站在線時進行更改,而無需停機? 2)你會使用內置的角色/成員提供者嗎? 3)你想使用屬性(如mvc [Authorize])等? 4)你想允許用戶以編程方式更改權限/角色?

以上任何一項意味着您必須將信息存儲在數據庫中。

對於規模較小的應用程序,我更喜歡只創建一些靜態方法,還可以使用某種繼承,即:

isadmin() 
{ 
    if (usernameArray.Contains[currentname]) 
     return true; 
    [...] 
} 

ispublisher() 
{ 
    if (isadmin()) return true; 
    [...] 
    } 

,包括每個用戶僞類權限表。

更新:爲特定的訪問DB模式:(*爲重點,&爲外鍵)

Users: 
Username * 
[...] 


UserClasses (EG: admin...) 
ID * 
description 

AccessTypes (EG: can delete) 
ID * 
description 

UserClassesAssign 
classid *& 
username *& 

AccessPerClass 
accessid *& 
classid *& 

所以,任何時候你想看看「用戶名」能夠「CanDelete」你必須檢查用戶'用戶名'是否鏈接到任何鏈接到訪問'CanDelete'的類,並且這些鏈接當然可以在運行時更改

+0

我不確定在數據庫中擁有權限實際上可以幫助您執行它們在運行時。例如:假設我在ASP.NET控制器類中有一個名爲DeleteUser的操作方法。在數據庫權限表中添加一個名爲CanDeleteUser的新權限將如何在運行時影響此操作?我將不得不在代碼中添加DeleteUser方法來檢查數據庫的CanDeleteUser權限,重新編譯並部署它,然後我會看到新的權限被強制執行。 – Krishna

+0

我不太理解爲什麼在將其添加到數據庫後應重新編譯應用程序的原因?假設一個存儲過程,返回bool的CheckIfHasAccess('DeleteItem','CurrentUsername'),你可以在運行時檢查。查看數據庫模式的答案更新 –

相關問題