基于角色的访问控制(RBAC)类设计

本文关键字:RBAC 访问控制 角色 于角色 | 更新日期: 2023-09-27 18:16:48

我试图创建一个基于角色的访问控制,并通过一些谷歌搜索,我找到了创建用户表,角色表,用户角色表,权限表和角色权限表的解决方案。但是我没有发现太多关于类设计的观点。例如,我有一个ADMIN角色(使用继承IRole作为父接口),我需要创建一个单独的类,或者我应该只创建一个角色类,记录为ADMIN。请建议。

基于角色的访问控制(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
   }
}