我想在我的ASP.NET MVC项目中实现动态授权,其中系统管理员可以将资源权限动态分配给用户和角色。我正在使用下表管理权限。
这些表的模型是
public class Resource
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? ParentResourceId { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public int Order { get; set; }
public Resource ParentResource { get; set; }
public ICollection<Permission> Permissions { get; set; }
}
public class Permission
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int ResourceId { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public int Order { get; set; }
public Resource Resource { get; set; }
}
在树形视图之类的UI上我需要显示资源权限根据资源层次结构”,以便管理员可以检查权限并将其分配给用户和角色。使用递归函数(如下所示),我可以建立资源层次结构(仅来自资源表),但不能包含对此层次结构的许可。到目前为止,我已经尝试过了。
public List<PermissionTreeDto> GetPermissions()
{
var permissions = _context.Resources
.Where(r => r.OrganizationId == OrganizationId)
.ToList();
return permissions.Where(r => r.ParentResourceId == null)
.OrderBy(r => r.Order)
.Select(r => new PermissionTreeDto
{
id = 0,
text = r.DisplayName,
@checked = false,
children = GetChildren(permissions, r.Id)
}).ToList();
}
private List<PermissionTreeDto> GetChildren(List<Resource> permissions, int parentId)
{
return permissions.Where(r => r.ParentResourceId == parentId)
.OrderBy(r => r.Order)
.Select(r => new PermissionTreeDto
{
id = 0,
text = r.DisplayName,
@checked = false,
children = GetChildren(permissions, r.Id)
}).ToList();
}
有人可以帮我吗。我的模型设计中也可能有任何错误。在这种情况下,请提出任何更好的方法来实现我期望的相同目标。
我已经以这种方式通过许可管理了层次结构-
public List<ResourceTreeDto> GetPermissions()
{
var resources = _context.Resources.Include(r=>r.Permissions)
.Where(r => r.OrganizationId == OrganizationId)
.ToList();
return resources.Where(r => r.ParentResourceId == null)
.OrderBy(r => r.Order)
.Select(r => new ResourceTreeDto
{
id = 0,
text = r.DisplayName,
@checked = false,
children = r.Permissions.OrderBy(p=>p.Order).Select(p => new ResourceTreeDto()
{
id = p.Id,
text = p.DisplayName,
@checked = false
}).Union(GetChildren(resources, r.Id))
}).ToList();
}
private IEnumerable<ResourceTreeDto> GetChildren(List<Resource> resources, int parentId)
{
return resources.Where(r => r.ParentResourceId == parentId)
.OrderBy(r => r.Order)
.Select(r => new ResourceTreeDto
{
id = 0,
text = r.DisplayName,
@checked = false,
children = r.Permissions.OrderBy(p => p.Order).Select(p => new ResourceTreeDto()
{
id = p.Id,
text = p.DisplayName,
@checked = false
}).Union(GetChildren(resources, r.Id))
});
}