標籤:
1.1. Role-Permission
UserRole是User與Role的關聯表,代碼見User-Role分析。參考可得Role-Permission的設計,代碼圖如下,RolePermission是Role與Permission的關聯表,儲存著RoleId與PermissionId。
1.1.1. 建立RolePermission
在IdentityModels.cs中增加ApplicationRolePermission類。
public class ApplicationRolePermission { public virtual string RoleId { get; set; } public virtual string PermisssionId { get; set; } } |
1.1.2. 添加RolePermission列表
向ApplicationRole中添加RolePermission列表。
public class ApplicationRole : IdentityRole { public ApplicationRole() : base() { Permissions = new List<ApplicationRolePermission>(); } public ApplicationRole(string roleName) : this() { base.Name = roleName; } [Display(Name = "角色描述")] public string Description { get; set; } /// <summary> /// 許可權列表 /// </summary> public ICollection<ApplicationRolePermission> Permissions { get; set; } } |
向ApplicationPermission中添加RolePermission列表。
public class ApplicationPermission { public ApplicationPermission() { Id = Guid.NewGuid().ToString(); Roles = new List<ApplicationRolePermission>(); } /// <summary> /// 主鍵 /// </summary> public string Id { get; set; } /// <summary> /// 控制器名 /// </summary> public string Controller { get; set; } /// <summary> /// 方法名 /// </summary> public string Action { get; set; } /// <summary> /// 參數字串 /// </summary> public string Params { get; set; } /// <summary> /// 功能描述 /// </summary> public string Description { get; set; } /// <summary> /// 角色列表 /// </summary> public ICollection<ApplicationRolePermission> Roles { get; set; } } |
1.1.3. 配置Role-Permission多對多關係
重寫ApplicationDbContext的OnModelCreating,配置Role-RolePermission和Permission-RolePermission的1對多關係。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext() : base("DefaultConnection") { // 在第一次啟動網站時初始化資料庫添加管理使用者憑據和admin 角色到資料庫 Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer()); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { if (modelBuilder == null) { throw new ArgumentNullException("modelBuilder"); } //配置permission與rolePermission的1對多關係 EntityTypeConfiguration<ApplicationPermission> configuration = modelBuilder.Entity<ApplicationPermission>().ToTable("ApplicationPermissions"); configuration.HasMany<ApplicationRolePermission>(u => u.Roles).WithRequired().HasForeignKey(ur => ur.PermisssionId); //配置role與persmission的映射表RolePermission的鍵 modelBuilder.Entity<ApplicationRolePermission>().HasKey(r => new { PermisssionId = r.PermisssionId, RoleId = r.RoleId }).ToTable("ApplicationRolePermissions"); //配置role與RolePermission的1對多關係 EntityTypeConfiguration<ApplicationRole> configuration2 = modelBuilder.Entity<ApplicationRole>(); configuration2.HasMany<ApplicationRolePermission>(r => r.Permissions).WithRequired().HasForeignKey(ur => ur.RoleId); base.OnModelCreating(modelBuilder); } public static ApplicationDbContext Create() { return new ApplicationDbContext(); } public new IDbSet<ApplicationRole> Roles { get; set; } public virtual IDbSet<ApplicationPermission> Permissions { get; set; } } |
注意:因為需要的類型是ApplicationRole,所以覆蓋了父類中屬性Roles定義。
1.1.4. 建立ViewModel
向PermissionViewModel中添加RoleId、RoleName屬性。
public class PermissionViewModel { /// <summary> /// 主鍵 /// </summary> [Display(Name = "許可權ID")] public string Id { get; set; } /// <summary> /// 控制器名 /// </summary> [Required(AllowEmptyStrings = false)] [Display(Name = "控制器名")] public string Controller { get; set; } /// <summary> /// 方法名 /// </summary> [Required(AllowEmptyStrings = false)] [Display(Name = "方法名")] public string Action { get; set; } /// <summary> /// 功能描述 /// </summary> [Required(AllowEmptyStrings = true)] [Display(Name = "功能描述")] public string Description { get; set; } [Display(Name = "選擇")] public bool Selected { get; set; } [Display(Name = "角色ID")] public string RoleId { get; set; } [Display(Name = "角色名稱")] public string RoleName { get; set; } } |
1.1.5. 建立Controller
Role-Permission管理無需編輯功能,比Permission管理多了一個傳入參數RoleId,建立RolePermissionsController.cs,添加相應的MVC組件,這裡不再累述可參考前面章節。
Index,使用AutoMapper完成對象映射。
public async Task<ActionResult> Index(string roleId) { //取role列表 var roles = _roleManager.Roles.ToList(); //roleId是否為空白 if (roleId == null) { //取第一個role的id roleId = roles.FirstOrDefault().Id; } //放入viewbag,設定預設值 ViewBag.RoleID = new SelectList(roles, "ID", "Description", roleId); //取角色許可權列表 var permissions = await _roleManager.GetRolePermissionsAsync(roleId); //建立ViewModel var permissionViews = new List<PermissionViewModel>(); var map = Mapper.CreateMap<ApplicationPermission, PermissionViewModel>(); permissions.Each(t => { var view = Mapper.Map<PermissionViewModel>(t); view.RoleID = roleId; permissionViews.Add(view); }); //排序 permissionViews.Sort(new PermissionViewModelComparer()); return View(permissionViews); } |
HttpPost方法的Create。
// POST: RolePermissions/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Create(string roleId, IEnumerable<PermissionViewModel> data) { if (string.IsNullOrWhiteSpace(roleId)) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } //添加Permission foreach (var item in data) { var permission = new ApplicationRolePermission { RoleId = roleId, PermissionId = item.Id }; //方法1,用set<>().Add() _db.Set<ApplicationRolePermission>().Add(permission); } //儲存; var records = await _db.SaveChangesAsync(); //return RedirectToAction("Index", new { roleId = roleId }); //返回訊息 Dictionary<string, bool> response = new Dictionary<string, bool>(); response.Add("Success", true); return new JsonResult { Data = response }; } |
1.1.6. 運行效果
Index
Create
ASP.NET Identity “角色-許可權”管理 6