• ASP.NET Identity “角色-权限”管理 8


    1.       典型应用场景

    1.1.       EF数据存储

    EF的核心是数据上下文DbContext,它提供了基本的数据存储操作方法。

    1.1.1.      新增

    采用添加对象的方式。

    //创建权限

    var permission = new ApplicationPermission

    {

        Id = item.Id,

        Action = item.Action,

        Controller = item.Controller,

        Description = item.Description

    };

    _db.Permissions.Add(permission);

    //保存

    await _db.SaveChangesAsync();

    1.1.2.      修改

        采用修改实体状态的方式。

    _db.Entry(applicationPermission).State = EntityState.Modified;

    _db.SaveChanges();

    1.1.3.      删除

        采用移除对象的方式。

    ApplicationPermission applicationPermission = _db.Permissions.Find(id);

    _db.Permissions.Remove(applicationPermission);

    _db.SaveChanges();

    采用修改实体状态的方式。

    //删除Permission

    var entity = new ApplicationRolePermission { RoleId = roleId, PermissionId = permissionId };

    _db.Set<ApplicationRolePermission>().Attach(entity);

    _db.Entry(entity).State = EntityState.Deleted;

     

    var result = await _db.SaveChangesAsync();

    1.1.4.      查询

    示例项目中的部分代码。

    //取数据上下文

    var context = HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();

    //取角色

    var role = context.Roles.Include(r => r.Permissions).FirstOrDefault(t => t.Id == roleId);

    //取权限ID列表       

    var rolePermissionIds = role.Permissions.Select(t => t.PermissionId);

    //取权限列表

    permissions = context.Permissions.Where(p => rolePermissionIds.Contains(p.Id)).ToList();

    var permissions = await _db.Permissions.ToListAsync();

    ApplicationPermission applicationPermission = _db.Permissions.Find(id);

    1.2.       自定义比较器

    1.2.1.      相等比较IEqualityComparer

    ApplicationPermission对象是否相等需要依次比较Controller、Action和Description,属于自定义规则,为此比较器要实现相等比较接口IEqualityComparer。

    public class ApplicationPermissionEqualityComparer : IEqualityComparer<ApplicationPermission>

    {

        public bool Equals(ApplicationPermission x, ApplicationPermission y)

        {

            //先比较ID

            if (string.Compare(x.Id, y.Id, true) == 0)

            {

                return true;

            }

            //而后比较Controller,Action,Description和Params

            if (x.Controller == y.Controller || x.Action == y.Action || x.Description == y.Description )

            {

                return true;

            }

            else

            {

                return false;

            }

        }

     

        public int GetHashCode(ApplicationPermission obj)

        {

            var str = string.Format("{0}-{1}-{2}", obj.Controller, obj.Action, obj.Description);

            return str.GetHashCode();

        }

    }

    在Contains中使用比较器。

    //是否授权

    if (rolePermissions.Contains(action, new ApplicationPermissionEqualityComparer()))

    {

        return true;

    }

    else

    {

        return false;

    }

    在Except中使用比较器。

    //取程序集中权限

    var allPermissions = _permissionsOfAssembly;

    //取数据库已有权限

    var dbPermissions = _db.Permissions.ToList();

    //取两者差集

    var permissions = allPermissions.Except(dbPermissions, new ApplicationPermissionEqualityComparer());

    1.2.2.      大小比较IComparer

    PermissionViewModel需要按Controller、Action进行排序,属于自定义规则,为此比较器要实现大小比较接口IComparer。

    public class PermissionViewModelComparer : IComparer<PermissionViewModel>

    {

        public int Compare(PermissionViewModel x, PermissionViewModel y)

        {

            //id相同,则相等

            if (string.Compare(x.Id, y.Id, true) == 0)

            {

                return 0;

            }

            //controller比较

            var controllerCompareResult = string.Compare(x.Controller, y.Controller, true);

            //action比较

            var actionCompareResult = string.Compare(x.Action, y.Action, true);

            //先比较controller,后比较action

            if (controllerCompareResult != 0)

            {

                return controllerCompareResult;

            }

            else

            {

                return actionCompareResult;

            }

        }

    }

    使用比较器。

    //排序

    permissionViews.Sort(new PermissionViewModelComparer());

  • 相关阅读:
    python读写hdf5及cdf格式文件
    常用python shell
    opencv的使用——经典大坑
    opencv python实用操作
    opencv python基本操作
    opencv c++实用操作
    opencv c++基本操作
    opencv安装
    [HNOI2005]星际贸易
    [2017SEERC]Divide and Conquer
  • 原文地址:https://www.cnblogs.com/mlemon/p/4304592.html
Copyright © 2020-2023  润新知