博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP Zero 导航菜单之角色权限
阅读量:6957 次
发布时间:2019-06-27

本文共 8199 字,大约阅读时间需要 27 分钟。

本文的项目是官网生成,项目名称为XX,WEB为MVC,以Users权限模块为例解说文章。

1.定义PermissionNames

PermissionNames是一个静态类,它在/XX.Core/Authorization之下

public const string Pages_Users = "Pages.Users";
// 子权限名称 // public const string Pages_Users_Create = "Pages.Users.Create";

2.添加权限控制

XXAuthorizationProvider.cs,修改SetPermissions方法

public override void SetPermissions(IPermissionDefinitionContext context)        {            //Common permissions            var pages = context.GetPermissionOrNull(PermissionNames.Pages);            if (pages == null)            {                pages = context.CreatePermission(PermissionNames.Pages, L("Pages"));            }            var users = pages.CreateChildPermission(PermissionNames.Pages_Users, L("Users"));//这里是自定义的权限       //users.CreateChildPermission(PermissionNames.Pages_Users_Create, L("Users_Create"));//这里是自定义的子权限
}

3.添加菜单权限

在web项目下的App_Start中有一个XXNavigationProvider类,它在XXWebModule类的PreInitialize配置

在XXNavigationProvider类的SetNavigation方法中进行添加菜单,且控制配置权限

context.Manager.MainMenu                .AddItem(                    new MenuItemDefinition(                        "Home",                        L("HomePage"),                        url: "",                        icon: "fa fa-home",                        requiresAuthentication: true                        )                ).AddItem(                    new MenuItemDefinition(                        "Tenants",                        L("Tenants"),                        url: "Tenants",                        icon: "fa fa-globe",                        requiredPermissionName: PermissionNames.Pages_Tenants                        )                ).AddItem(                    new MenuItemDefinition(                        "Users",                        L("Users"),                        url: "Users",                        icon: "fa fa-users",                        requiredPermissionName: PermissionNames.Pages_Users  //这是自定义的权限                        )                ).AddItem(                    new MenuItemDefinition(                        "About",                        L("About"),                        url: "About",                        icon: "fa fa-info"                        )                );        }

4.展示菜单

在Layout控制器中,使用局部视图TopMenu进行展示,到这里已经完成

 

@using Abp.Collections.Extensions@using Zmcor.Web.Views@model Zmcor.Web.Models.Layout.TopMenuViewModel@{    var calculateMenuUrl = new Func
((url) => { if (string.IsNullOrEmpty(url)) { return ApplicationPath; } if (UrlChecker.IsRooted(url)) { return url; } return ApplicationPath + url; });}@foreach (var menuItem in Model.MainMenu.Items){
}

 

5.角色和权限的关联

为用户添加角色

在UserAppService注入UserManager

private readonly UserManager _userManager;

设置角色代码

///         /// 设置用户角色        ///          /// 
public async Task SetUserRole(long currentUserId, long userId, string[] roleName) { //权限判断... var user = _userRepository.FirstOrDefault(s => s.Id == userId); await _userManager.SetRoles(user, roleName); }

在abp中,默认有Admin角色,如果需要创建自己的角色,如下

var myRole = new Role(null,"roleName", "我的角色名称");await _roleManager.CreateAsync(myRole);

为角色分配权限

控制器

//视图显示  [HttpGet]        public async Task
SetRoleMenu(int Id) { var role = _roleAppService.GetRolesById(Id); var myPermissions = await _roleAppService.GetGrantedPermissionsAsync(Id);//数据库中角色对应的权限 ViewBag.MyPermissions = myPermissions; var rolePermissions = _roleAppService.GetRolePermissionsForManage(); var dictList = new Dictionary
(); foreach (var item in rolePermissions) { dictList.Add(item.Name, item.DisplayName.ToString().Split(' ')[1].Trim(',')); } ViewBag.RoleList = dictList;//步骤2所定义的权限 return View(role); }

 

//提交 [HttpPost]        public async Task
SetRoleMenu(int Id, string PermissionNames) { try { PermissionNames = Request.Form["PermissionNames"]; if (string.IsNullOrWhiteSpace(PermissionNames)) { return new JsonNetErrorResult("请至少选择一个角色!"); } var roleNames = PermissionNames.Split(',').ToList(); var input = new UpdateRolePermissionsInput() { RoleId = Id, GrantedPermissionNames = roleNames }; var userInfo = GetCurrentUserInfo(); await _roleAppService.UpdateRolePermissions(userInfo.UserId,input); return new JsonNetSuccessResult(); } catch (Exception ex) { return new JsonNetErrorResult("更新出错" + ex.Message); } }

应用层

public async Task
> GetGrantedPermissionsAsync(int roleId) { List
grantedList = new List
(); var grantedPermissions = await _roleManager.GetGrantedPermissionsAsync(roleId); foreach (var item in grantedPermissions) { grantedList.Add(item.Name); } return grantedList; } public List
GetRolePermissionsForManage() { var grantedPermissions = _permissionManager .GetAllPermissions() .Where(s => s.Name.Contains("Pages.")) .ToList(); return grantedPermissions; }

 

public async Task UpdateRolePermissions(long userId, UpdateRolePermissionsInput input)        {            var userAndRole = _userRepository.GetUserAndRolesById(userId);            if (userAndRole == null || userAndRole.IsAdmin()))            {                throw new UserFriendlyException("您无权限进行该操作");            }             var role = await _roleManager.GetRoleByIdAsync(input.RoleId);            // 如果有子权限,只要添加父权限,会自动添加子权限            //var grantedPermission = _permissionManager            //    .GetAllPermissions()            //    .Where(p => input.GrantedPermissionNames.Any(s=> p.Name.Contains(s)))            //    .ToList();            var grantedPermissions = _permissionManager                .GetAllPermissions()                .Where(p => input.GrantedPermissionNames.Contains(p.Name))                .ToList();            await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);        }

IPermissionManager使用_permissionManager.GetAllPermissions() 可以获取到在步骤2所添加的权限

 

获取当前角色的权限:RoleManager => GetGrantedPermissionsAsync(roleId)

获取所有权限:IPermissionManager=> GetAllPermissions()

更新权限:RoleAppService=> UpdateRolePermissions(UpdateRolePermissionsInput input)  

    input.GrantedPermissionNames为需授权的权限列表

 扩展:授权验证

控制器授权

[AbpMvcAuthorize(PermissionNames.Pages_Users)] public class UsersController : XXControllerBase

Action授权

[AbpMvcAuthorize(PermissionNames.Companys)]        [HttpGet]        public async Task
Main() { return View(); }

 

应用层的授权

[AbpAuthorize(PermissionNames.Pages_Users)]    public class UserAppService : ZmcorAppServiceBase, IUserAppService

 

总结:角色权限这个模块,整体使用的还是比较简单、畅通的,注意还需要配置相关的本地化语言文件。如果存在比较复杂的角色和权限,还需要经过一定的设计才能获得良好的体验

 

 

 
 

转载地址:http://mfmil.baihongyu.com/

你可能感兴趣的文章
详解Facebook田渊栋NIPS2017论文:让大家都能做得起深度强化学习研究的ELF平台
查看>>
DJANGO,获取当前用户名,用户组名,用户组权限
查看>>
mysql 常用函数
查看>>
数据库安全管理实践 你的数据库在哪里?
查看>>
使用VMware VSphere WebService SDK进行开发 (四)——获取集群(Cluster, ComputeResource)的相关信息...
查看>>
java-collection的 iterator 返回的迭代器快速失败
查看>>
区块链遇到数据库:相爱还是相杀?
查看>>
及时警惕!云计算带来的安全风险
查看>>
太阳能示范基地光伏项目一期工程竣工
查看>>
机器学习之正则化图文讲解
查看>>
深入剖析ASP.NET的编译原理之二:预编译(Precompilation)
查看>>
阿里云前端周刊 - 第 31 期
查看>>
游戏安全资讯精选 2017年第十三期 Typecho前台无限制Getshell漏洞预警,勒索软件市场正在呈爆炸式增长...
查看>>
字符串编码解压缩算法
查看>>
电子化的阅读:学习时代的新行为
查看>>
硅谷·北京 云世界2012思想再激荡
查看>>
中国人工智能学会通讯——意识科学研究进展 1.1 意识问题的科学陈述及其当代研究目标的设定...
查看>>
颠覆传统的中兴微模块数据中心 开启中小企业的大数据梦
查看>>
Gartner:人工智能将把部分专业工作变成公用事业
查看>>
西数企业级市场大救星:充氦硬盘
查看>>