如何在asp.net MVC中实现动态资源权限?

问题描述 投票:0回答:1

我想在我的ASP.NET MVC项目中实现动态授权,其中系统管理员可以将资源权限动态分配给用户和角色。我正在使用下表管理权限。

  1. 资源
  2. ResourcePermission

这些表的模型是

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();
    }

我正在使用gijgo引导树视图。enter image description here

有人可以帮我吗。我的模型设计中也可能有任何错误。在这种情况下,请提出任何更好的方法来实现我期望的相同目标。

asp.net-mvc asp.net-identity-2 asp.net-authorization
1个回答
0
投票

我已经以这种方式通过许可管理了层次结构-

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))
            });
    }

现在,我得到了预期的输出,例如-enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.