分享

基于ABP框架实现RBAC(角色访问控制)

做网站的 发表于 2017-1-15 23:17:30 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 6728
正在营业体系需供计划过程当中,凡是关于诸如构造机构、用户战角色等这类根底功用,凡是是将那部门功用计划到通用子域中,那也阐明了,关于那部门功用来说,是体系的基石,全部营业系统是成立于那部门基石之上的,当然,另有诸如多言语、设置办理、认证战受权等。关于那部门功用,ABP中存正在那些观点,并且经由过程Module Zero模块完成了那些观点。
1、角色会见掌握之RBAC

RBAC:Role Based Access Control,基于角色的会见掌握,那正在今朝年夜大都硬件中来说曾经算得上是遍及使用了,最多见的构造以下,构造俭朴,设想思绪分明。
网络编程-云社区基于ABP框架实现RBAC(角色访问控制)byun.com(1)
                               
登录/注册后可看年夜图

可是也存正在别的晋级版的设想,诸如用户权限表、角色组、用户组的观点等,详细分类有RBAC0、RBAC1、RBAC2等,后者功用愈来愈壮大,也愈来愈庞大。

         
  • RBAC0:是RBAC的核心思惟。     
  • RBAC1:是把RBAC的角色分层模型。     
  • RBAC2:增长了RBAC的束缚模型。     
  • RBAC3:整开RBAC2 + RBAC1。
2、ABP中的RBAC

正在Abp中,曾经散成了那些观点,并正在ModuleZero模块中完成了那些观点,基于IdentityServer4的ModuleZero模块完成了启拆。关于我们年夜大都以营业为中心的开辟职员来说,不该该又来制一个轮子,而是该当开好那辆车。首先看下Abp中的RBAC模型
网络编程-云社区基于ABP框架实现RBAC(角色访问控制)byun.com(2)
                               
登录/注册后可看年夜图

正在那此中权限表中记载了用户取权限,角色取权限两部门。关于权限凡是指的是功用权限战数据权限两部门,普通来说,年夜多指的是功用权限,这类经由过程角色取权限停止办理便可,如另有用户部门的功用辨别,则能够再利用上用户取权限,而关于数据权限,能够操纵用户取权限部门,小我私家用的比力少,可是,能够设想到那么一个场景,针关于一家门店内乱的多个店少,角色不异即响应的权限不异,但各自体贴的数据根源不同,体贴东部、北部等数据,而没有体贴西部、北部数据,因而能够正在数据层里停止别离,比如设置数据根源,东北西北,关于数据根源停止权限联系关系,多么一去用户本人假如具有东部数据权限,则只能看到东部数据。
1、权限声明及使用

正在Abp中,需求首先正在Core层/Authorization/PermissionNames.cs中声明权限,Abp权限部门设想准绳是:
  1. 先声明再利用
复造代码

  1. /// <summary>
  2. /// 权限定名
  3. /// </summary>
  4. public static class PermissionNames
  5. {
  6.     #region 顶级权限
  7.     public const string Pages = "Pages";
  8.     #endregion

  9.     #region 根底支持仄台
  10.     public const string Pages_Frame = "Pages.Frame";

  11.     #region 租户办理
  12.     public const string Pages_Frame_Tenants = "Pages.Frame.Tenants";
  13.     #endregion

  14.     #region 构造机构
  15.     public const string Pages_Frame_OrganizationUnits = "Pages.Frame.OrganizationUnits";
  16.     public const string Pages_Frame_OrganizationUnits_Create = "Pages.Frame.OrganizationUnits.Create";
  17.     public const string Pages_Frame_OrganizationUnits_Update = "Pages.Frame.OrganizationUnits.Update";
  18.     public const string Pages_Frame_OrganizationUnits_Delete = "Pages.Frame.OrganizationUnits.Delete";
  19.     #endregion

  20.     #region 用户办理
  21.     public const string Pages_Frame_Users = "Pages.Frame.Users";
  22.     public const string Pages_Frame_Users_Create = "Pages.Frame.Users.Create";
  23.     public const string Pages_Frame_Users_Update = "Pages.Frame.Users.Update";
  24.     public const string Pages_Frame_Users_Delete = "Pages.Frame.Users.Delete";
  25.     public const string Pages_Frame_Users_ResetPassword = "Pages.Frame.Users.ResetPassword";
  26.     #endregion

  27.     #region 脚色办理
  28.     public const string Pages_Frame_Roles = "Pages.Roles";
  29.     public const string Pages_Frame_Roles_Create = "Pages.Frame.Roles.Create";
  30.     public const string Pages_Frame_Roles_Update = "Pages.Frame.Roles.Update";
  31.     public const string Pages_Frame_Roles_Delete = "Pages.Frame.Roles.Delete";
  32.     #endregion

  33. }
复造代码
然后正在Core层/Authorization/XXXAuthorizationProvider.cs中设置详细权限,正在此处设置权限时,能够按照权限设想工夫的职责别离,比如假如仅仅是多租户需求那部门,那便设置权限范畴为多租户便可。
  1. public class SurroundAuthorizationProvider : AuthorizationProvider
  2. {
  3.     public override void SetPermissions(IPermissionDefinitionContext context)
  4.     {
  5.         #region 顶级权限
  6.         var pages = context.CreatePermission(PermissionNames.Pages, L("Pages"));
  7.         #endregion

  8.         #region 根底支持仄台
  9.         var frame = pages.CreateChildPermission(PermissionNames.Pages_Frame, L("Frame"));

  10.         #region 租户办理
  11.         frame.CreateChildPermission(PermissionNames.Pages_Frame_Tenants, L("Tenants"), multiTenancySides: MultiTenancySides.Host);
  12.         #endregion

  13.         #region 构造机构
  14.         var organizationUnits = frame.CreateChildPermission(PermissionNames.Pages_Frame_OrganizationUnits, L("OrganizationUnits"));
  15.         organizationUnits.CreateChildPermission(PermissionNames.Pages_Frame_OrganizationUnits_Create, L("CreateOrganizationUnit"));
  16.         organizationUnits.CreateChildPermission(PermissionNames.Pages_Frame_OrganizationUnits_Update, L("EditOrganizationUnit"));
  17.         organizationUnits.CreateChildPermission(PermissionNames.Pages_Frame_OrganizationUnits_Delete, L("DeleteOrganizationUnit"));
  18.         #endregion

  19.         #region 用户办理
  20.         var users = frame.CreateChildPermission(PermissionNames.Pages_Frame_Users, L("Users"));
  21.         users.CreateChildPermission(PermissionNames.Pages_Frame_Users_Create, L("CreateUser"));
  22.         users.CreateChildPermission(PermissionNames.Pages_Frame_Users_Update, L("UpdateUser"));
  23.         users.CreateChildPermission(PermissionNames.Pages_Frame_Users_Delete, L("DeleteUser"));
  24.         users.CreateChildPermission(PermissionNames.Pages_Frame_Users_ResetPassword, L("ResetPassword"));
  25.         #endregion

  26.         #region 脚色办理
  27.         var roles = frame.CreateChildPermission(PermissionNames.Pages_Frame_Roles, L("Roles"));
  28.         roles.CreateChildPermission(PermissionNames.Pages_Frame_Roles_Create, L("CreateRole"));
  29.         roles.CreateChildPermission(PermissionNames.Pages_Frame_Roles_Update, L("UpdateRole"));
  30.         roles.CreateChildPermission(PermissionNames.Pages_Frame_Roles_Delete, L("DeleteRole"));
  31.         #endregion
  32.     }
  33. }
复造代码
正在设置终了后,需求将该类散成到Core层/XXXCoreModule当前模块中,才气使得该部门权限设置见效。
  1. //设置权限办理
  2. Configuration.Authorization.Providers.Add<SurroundAuthorizationProvider>();
复造代码
做为营业的进口,菜单是较为曲不雅的表现方法,如今能够,为菜单分派权限了,具有权限的人材能看的到菜单,同时布景办法中也要有权限断定,菜单仅做为前端进口上的掌握,权限断定做为后真个掌握。正在MVC层的Startup/XXXNavigationProvider.cs中完成菜单的设置事情,能够设置多级菜单,每一个菜单能够设置响应的权限,正在生成菜单断定时,假如女级菜单权限不敷,则间接会跳过子级菜单的断定。
  1. new MenuItemDefinition(//根底支持
  2.     PageNames.FrameManage,
  3.     L(PageNames.FrameManage),
  4.     icon: "&#xe828;",
  5.     requiredPermissionName: PermissionNames.Pages_Frame
  6. ).AddItem(
  7.     new MenuItemDefinition(//构造机构
  8.         PageNames.OrganizationUnits,
  9.         L(PageNames.OrganizationUnits),
  10.         url: "/OrganizationUnits",
  11.         icon: "&#xe6cb;",
  12.         requiredPermissionName: PermissionNames.Pages_Frame_OrganizationUnits
  13.     )
  14. ).AddItem(
  15.     new MenuItemDefinition(//用户办理
  16.         PageNames.Users,
  17.         L(PageNames.Users),
  18.         url: "/Users",
  19.         icon: "&#xe6cb;",
  20.         requiredPermissionName: PermissionNames.Pages_Frame_Users
  21.     )
  22. ).AddItem(
  23.     new MenuItemDefinition(//脚色办理
  24.         PageNames.Roles,
  25.         L(PageNames.Roles),
  26.         url: "/Roles",
  27.         icon: "&#xe6cb;",
  28.         requiredPermissionName: PermissionNames.Pages_Frame_Roles
  29.     )
  30. ).AddItem(
  31.     new MenuItemDefinition(//体系设置
  32.         PageNames.HostSettings,
  33.         L(PageNames.HostSettings),
  34.         url: "/HostSettings",
  35.         icon: "&#xe6cb;",
  36.         requiredPermissionName: PermissionNames.Pages_Frame_HostSettings
  37.     )
  38. )
复造代码
正在前端页里上,关于按钮级此外掌握也经由过程权限断定,Abp供给了断定办法,操纵Razor语法停止按钮掌握
  1. @if (await PermissionChecker.IsGrantedAsync(PermissionNames.Pages_Core_DataDictionary_Create))
  2. {
  3.     <button class="layui-btn layuiadmin-btn-dataDictionary" data-type="addDataDictionary">增加范例</button>
  4. }
复造代码
正在后端办法上,凡是我喜好间接正在使用效劳中的办法上做权限断定(当然也可畴前移到MVC层,可是多么一去,针关于WebApi形式的Host层,又很多减一次断定了),操纵AbpAuthorize特征,断定该办法需求哪几个权限才气会见,而正在mvc的掌握器上做会见认证。
  1. [AbpAuthorize(PermissionNames.Pages_Core_DataDictionary_Create)]
  2. private async Task CreateDataDictionaryAsync(CreateOrUpdateDataDictionaryInput input)
  3. {

  4. }
复造代码
2、角色取权限

正在Abp中,角色疑息存储正在abprole表中,角色取权限间的联系关系存储正在abppermission那张表中,一个角色有多个权限,假如某个角色的权限被来失落了,那张表中的相干记载将由abp卖力删除,我们只需求完成掌控哪些权限是那个角色有的便止。Abp中曾经完成了角色的一切操纵,可是前端部门接纳的是bootstrap弄的,将其革新一波,成为layui气势派头。
网络编程-云社区基于ABP框架实现RBAC(角色访问控制)byun.com(3)
                               
登录/注册后可看年夜图

正在创立角色中,次要是将选中的权限挂钩到详细的某个角色上,该部门代码相沿abp中自带的角色权限处置办法。
  1. private async Task CreateRole(CreateOrUpdateRoleInput input)
  2. {
  3.     var role = ObjectMapper.Map<Role>(input.Role);
  4.     role.SetNormalizedName();

  5.     CheckErrors(await _roleManager.CreateAsync(role));

  6.     var grantedPermissions = PermissionManager
  7.         .GetAllPermissions()
  8.         .Where(p => input.PermissionNames.Contains(p.Name))
  9.         .ToList();

  10.     await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);
  11. }
复造代码
指定角色Id,租户Id及之前声明的权限称号,正在abppermission中可查察到详细角色权限。
网络编程-云社区基于ABP框架实现RBAC(角色访问控制)byun.com(4)
                               
登录/注册后可看年夜图

3、用户取角色

一个用户能够负担多个角色,实行不同角色的使命,做为一个营业体系最根本的单位,abp中供给了那些观点并正在Module Zero模块中曾经完成了对用户的一系列操纵,用户疑息存储正在AbpUsers表中,用户间接联系关系的角色保留正在AbpUserRoles表中,abp中MVC版本接纳的是bootstrap气势派头,因而,用layui气势派头完成一次改换,并且,窜改一些页里构造。
网络编程-云社区基于ABP框架实现RBAC(角色访问控制)byun.com(5)
                               
登录/注册后可看年夜图

Abp版本中,因为是土耳其年夜佬所开辟的风俗,针关于姓战名做了拆分,因而关于我们的利用要做一次处置,我那先俭朴处置了一下,并且正在营业体系中,邮箱时偶然无,因而也需求停止思索。
  1. [AbpAuthorize(PermissionNames.Pages_Frame_Users_Create)]
  2. private async Task CreateUser(CreateOrUpdateUserInput input)
  3. {
  4.     var user = ObjectMapper.Map<User>(input.User);
  5.     user.TenantId = AbpSession.TenantId;
  6.     user.IsEmailConfirmed = true;
  7.     user.Name = "Name";
  8.     user.Surname = "Surname";
  9.     //user.EmailAddress = string.Empty;

  10.     await UserManager.InitializeOptionsAsync(AbpSession.TenantId);
  11.     foreach (var validator in _passwordValidators)
  12.     {
  13.         CheckErrors(await validator.ValidateAsync(UserManager, user, AppConsts.DefaultPassword));
  14.     }

  15.     user.Password = _passwordHasher.HashPassword(user, AppConsts.DefaultPassword);

  16.     await _userManager.InitializeOptionsAsync(AbpSession.TenantId);

  17.     CheckErrors(await _userManager.CreateAsync(user, AppConsts.DefaultPassword));

  18.     if (input.AssignedRoleNames != null)
  19.     {
  20.         CheckErrors(await _userManager.SetRoles(user, input.AssignedRoleNames));
  21.     }

  22.     if (input.OrganizationUnitIds != null)
  23.     {
  24.         await _userManager.SetOrganizationUnitsAsync(user, input.OrganizationUnitIds);
  25.     }

  26.     CurrentUnitOfWork.SaveChanges();
  27. }
复造代码
此处对用户小我私家零丁的权限出有来做处置,按照Abp的文档有那末一句话,年夜大都使用程序中,基于角色的曾经充足利用了,假如念声明特定权限给用户,那末针关于用户本人的角色权限则被笼盖。
网络编程-云社区基于ABP框架实现RBAC(角色访问控制)byun.com(6)
                               
登录/注册后可看年夜图

至此,修正整合用户、角色战权限参加到体系中开端完成了,至于一些更加丰硕的功用,待逐渐参加中,车子再好,司机也得睡觉。
堆栈地点:https://gitee.com/530521314/Partner.Surround.git
到此那篇闭于基于ABP框架完成RBAC(角色会见掌握)的文章便介绍到那了。期望对各人的进修有所协助,也期望各人多多撑持剧本之家。
                                                         
       以上所述是云社区专客手艺小编经心给各人收拾整顿的本常识相干引见;期望对亲们进修事情提拔有所协助。                                     若有任何疑问、相干分享交换等,可正在本文章底部留行或批评; 欢送IT手艺妙手亦或菜鸟们各持己见、万马齐喑,让云社区成为IT手艺更好的交换进修仄台;   正在此更万分感激各人对云社区专客网站的撑持!                                                                                                                                                                                                                                                                                            
滥觞:云社区转戴;            免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
回复

使用道具 举报

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

香港云服务器免费试用