ASP.NET Identity “角色-許可權”管理 6

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.