本文的项目是官网生成,项目名称为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<string, string>((url) =>
{
if (string.IsNullOrEmpty(url))
{
return ApplicationPath;
} if (UrlChecker.IsRooted(url))
{
return url;
} return ApplicationPath + url;
});
}
@foreach (var menuItem in Model.MainMenu.Items)
{
<li class="@(Model.ActiveMenuItemName == menuItem.Name ? "active" : "")">
@if (menuItem.Items.IsNullOrEmpty())
{
<a href="@calculateMenuUrl(menuItem.Url)">
@if (!string.IsNullOrWhiteSpace(menuItem.Icon))
{
<i class="@menuItem.Icon"></i>
}
@menuItem.DisplayName
</a>
}
else
{
<a href="" data-toggle="dropdown">
@if (!string.IsNullOrWhiteSpace(menuItem.Icon))
{
<i class="@menuItem.Icon"></i>
}
@menuItem.DisplayName
</a>
<ul class="dropdown-menu">
@foreach (var subMenuItem in menuItem.Items)
{
<li>
<a href="@calculateMenuUrl(subMenuItem.Url)">
@if (!string.IsNullOrWhiteSpace(subMenuItem.Icon))
{
<i class="@subMenuItem.Icon"></i>
}
@subMenuItem.DisplayName
</a>
</li>
}
</ul>
}
</li>
}

5.角色和权限的关联

为用户添加角色

在UserAppService注入UserManager

 private readonly UserManager _userManager;

设置角色代码

        /// <summary>
/// 设置用户角色
/// </summary>
/// <returns></returns>
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<ActionResult> 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<string, string>();
foreach (var item in rolePermissions)
{
dictList.Add(item.Name, item.DisplayName.ToString().Split(' ')[].Trim(','));
} ViewBag.RoleList = dictList;//步骤2所定义的权限 return View(role);
}
//提交
[HttpPost]
public async Task<JsonNetResult> 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<List<string>> GetGrantedPermissionsAsync(int roleId)
{
List<string> grantedList = new List<string>();
var grantedPermissions = await _roleManager.GetGrantedPermissionsAsync(roleId);
foreach (var item in grantedPermissions)
{
grantedList.Add(item.Name);
} return grantedList;
}
public List<Permission> 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<ActionResult> Main()
{
return View();
}

应用层的授权

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

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

ABP Zero 导航菜单之角色权限的更多相关文章

  1. DDD开发框架ABP之导航菜单

    每一个网站都会有导航菜单(通常不止一个),ASP.NET Boilerplate(后文简称ABP)提供了一种创建和使用菜单的通用架构,利用架构我们可以方便的创建菜单并显示给用户.本文主要说明菜单的创建 ...

  2. jeecg删除菜单导致角色权限设置点不开的问题解决

    在JEECG中经常需要删除一些菜单,但是由于当前使用版本jeecg3.7.1功能不够完善,需要手动去删除角色对应目录表的没删除干净的数据,要删除的数据查询SQL语句如下: select * from ...

  3. .net core3.1 abp动态菜单和动态权限(思路) (二)

    ps:本文需要先把abp的源码下载一份来下,跟着一起找实现,更容易懂 在abp中,对于权限和菜单使用静态来管理,菜单的加载是在登陆页面的地方(具体是怎么知道的,浏览器按F12,然后去sources中去 ...

  4. ABP入门系列(6)——定义导航菜单

    ABP入门系列目录--学习Abp框架之实操演练 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这 ...

  5. ABP之展现层(导航菜单)

    基本的增删改查已经粗糙的结束了,接下来就是要方便的展示了,也就是导航菜单.在Abp中已经对导航栏的设置进行了相应的封装(Abp.Application.Navigation),可以方便我们快速的将自己 ...

  6. .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)

    我们来创建动态菜单吧 首先,先对动态菜单的概念.操作.流程进行约束:1.Host和各个Tenant有自己的自定义菜单2.Host和各个Tenant的权限与自定义菜单相关联2.Tenant有一套默认的菜 ...

  7. MVC基于角色权限控制--菜单展示

    在用户成功登陆后台页面后,我们需要将当前用户拥有的权限通过菜单的形式展现出来,将未具备的权限隐藏 新建一个HomeController,用于展示后台首页和获取用户权限数据 namespace CZBK ...

  8. netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源

    AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统 特色: 用户管理 菜单管理 角色管理 权限管理 ...

  9. netcore mvc菜单,角色,权限

    netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源 AntMgr https://github.com/yuzd/AntMgr 基于netcore2.0 mvc 开发的 快速搭建 ...

随机推荐

  1. Solr4.10与tomcat整合并安装中文分词器

    1.solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引. ...

  2. MyBatis学习总结(一)简单入门案例

    MyBatis学习总结(一)简单入门案例 主要内容:本文主要通过对数据库中的use表进行增删改查总结mybatis的环境搭建和基本入门使用 一.需要的jar包: 1.核心包 2.依赖包 3.jdbc数 ...

  3. MySQL的存储引擎与日志说明

    1.1 存储引擎的介绍 1.1.1 文件系统存储 文件系统:操作系统组织和存取数据的一种机制.文件系统是一种软件. 类型:ext2 3 4 ,xfs 数据.  不管使用什么文件系统,数据内容不会变化, ...

  4. 使用WebEx录制视频并转换为MP4

    1.下载并安装WebEx http://www.question-defense.com/wp-content/uploads/2010/05/ateditor-version-3.0.zip 2.打 ...

  5. C#设计模式之二十二访问者模式(Visitor Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获 ...

  6. iOS tableView 数据处理,数据分类相同数据整合、合并计算总数总价

    // 数据下载得到数组数据 modelArray = [MZPriceModel mj_objectArrayWithKeyValuesArray:data[@"info"]]; ...

  7. ArcGIS 网络分析[8.4] 资料4 聚合——创建及打开网络数据集的类实现

    这篇是对前三篇的总结,因为网络数据集涉及的"点"太多了,我只能挑重点来设置,大家明白框架后可以自行寻求帮助文档添加功能. 我以C#类的形式给出,这个类包含很多种方法,因为本人的C# ...

  8. 模板引擎(smarty)知识点总结

    首先我们必须知道使用smarty的流程   1.引入   2.实例化   3.配置 模板目录  编译目录  3.0版本 支持不存在的目录则新建   4.赋值   5.编译显示 某个模板文件(暗示需要哪 ...

  9. lesson - 1 aming

    一.  Linux是什么* 关于Linux历史(http://www.aminglinux.com/bbs/thread-6568-1-1.html  需要大家查查资了解,也可以看看5期的视频)* 发 ...

  10. Spring 自动装配及自动注册的相关配置

    Spring支持好几种自动装配(Autowiring)的方式,以及自动扫描并注册Bean的配置(在beans.xml中配置). 下文我们进行一个小结. 1. <context: annotati ...