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