我正在尝试创建基于角色的访问控制,并通过一些谷歌搜索,我找到了创建用户表,角色表,用户角色表,权限表和角色权限表的解决方案。但是我从课堂设计的角度来看并不多。例如,我有一个ADMIN角色(通过将IRole作为父接口使用继承)我是否需要创建一个单独的类,或者我应该只创建记录为Admin的Role类。请指教。
答案 0 :(得分:2)
您不应该为每个角色继承一个新类,您将拥有一个角色列表,每个角色都有一组权限,每个用户都与一个或多个角色相关联,因此它应该是这样的:
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; }
}
权限列表将在数据库中预定义和静态,您无法在运行时更改它,因为您的代码将依赖于它。但是,您可以更改角色并将用户关联到角色。
在您的代码中,当您需要检查用户是否可以访问特定资源时,您将使用权限标记此资源。
例如:在以下代码中,用户只有在拥有更新权限时才会访问代码。
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
}
}