您的位置:首页 > 编程语言 > ASP

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

2015-02-28 00:26 411 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: