-2
我試圖創建一個基於角色的訪問控制和一些谷歌搜索,我找到了創建用戶表,角色表,用戶角色表,權限表和角色權限表的解決方案。但是我從課堂設計的角度來看並沒有多少發現。例如,我有一個ADMIN角色(通過以IRole作爲父接口使用繼承)是否需要創建一個單獨的類,或者是否應創建只記錄爲Admin的Role類。請指教。基於角色的訪問控制(RBAC)類設計
我試圖創建一個基於角色的訪問控制和一些谷歌搜索,我找到了創建用戶表,角色表,用戶角色表,權限表和角色權限表的解決方案。但是我從課堂設計的角度來看並沒有多少發現。例如,我有一個ADMIN角色(通過以IRole作爲父接口使用繼承)是否需要創建一個單獨的類,或者是否應創建只記錄爲Admin的Role類。請指教。基於角色的訪問控制(RBAC)類設計
你不應該繼承爲每個角色一個新的類,你將有角色的列表,每個角色都有一組權限,每個用戶被關聯到一個或多個角色,所以它應該是這樣的:
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public List<Permission> Permissions{ get; set; }
}
public class Permission
{
public int Id { get; set; }
public string Name { get; set; }
}
public enum Permissions
{
Read = 1,
Update = 2,
Add = 3,
Delete = 4 //rest of your roles
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public List<Role> Roles { get; set; }
}
權限列表將在數據庫中預定義和靜態,您不能在運行時更改它,因爲您的代碼將依賴於它。但是,您可以更改角色並將用戶與角色關聯。
在您的代碼中,當您需要檢查用戶是否有權訪問特定資源時,您將使用Permission標記此資源。例如:
例如:在下面的代碼中,只有擁有更新權限的用戶才能訪問代碼。
public void UpdateItem(Item item)
{
var currentUser = //get the user from the database or session
if(currentUser.Roles.Any(r=>r.Permissions.Any(p=>p.Id == (int)Permissions.Update))
{
// do the logic
}
else
{
// show access denied
}
}