一般實施某種形式的基於角色的訪問控制的時候,我們有以下著名的概念:基於角色的訪問控制 - 我應該在db中擁有權限列表還是僅在代碼中擁有權限列表(例如枚舉)?
- 角色
- 用戶
- 權限
而且,用戶將被分配給角色每一個都有一組權限(執行操作/訪問資源等)。 因此,用戶通過分配給一個或多個角色(已分配一組權限)獲得執行操作的權限。
在任何給定的應用程序中,權限是在編譯時定義的,因爲代碼實際上在訪問資源的各個地方強制執行權限。我認爲如果一組可能的權限/操作發生變化 - 它需要改變代碼並以任何方式進行重新編譯,所以在數據庫中查找/引用表不會提供任何超出事實的值一個數據庫管理員可以做一個快速的SQL查詢來列出應用程序使用的所有權限。
然而,我見過的大多數應用程序都爲權限創建了一個查找表,並且 - 也將它映射到代碼中的枚舉。
鑑於此,是否有任何理由實際上有一個數據庫表表示可能的權限列表(除了它可能更容易一些查看數據庫,而不是挖入代碼找到列表/枚舉的權限)?
我不確定在數據庫中擁有權限實際上可以幫助您執行它們在運行時。例如:假設我在ASP.NET控制器類中有一個名爲DeleteUser的操作方法。在數據庫權限表中添加一個名爲CanDeleteUser的新權限將如何在運行時影響此操作?我將不得不在代碼中添加DeleteUser方法來檢查數據庫的CanDeleteUser權限,重新編譯並部署它,然後我會看到新的權限被強制執行。 – Krishna
我不太理解爲什麼在將其添加到數據庫後應重新編譯應用程序的原因?假設一個存儲過程,返回bool的CheckIfHasAccess('DeleteItem','CurrentUsername'),你可以在運行時檢查。查看數據庫模式的答案更新 –