ABP Zero 导航菜单之角色权限

本文的项目是官网生成,项目名称为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(' ')[1].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

 

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

 

时间: 2024-10-01 23:19:42

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

树状菜单给角色赋权限-选中的树状菜单给角色赋予权限。求大神指教

问题描述 选中的树状菜单给角色赋予权限.求大神指教 解决方案 选中了给他个权限标记,存进数据库表就行了 解决方案二: 每个树节点,给一个id,根据id去数据库的权限表查询就可以了.

急!求救!根据登入用户的角色权限显示该显示的树形菜单

问题描述 在做OA系统时,用户登陆后台后,会自动根据用户的角色里的权限,来显示那些树形菜单的功能如何实现?比如说超级管理员会显示全部菜单,而普通用户只会显示"签到/签退""便签"等等.谢谢了.. 解决方案 解决方案二:这个简单啊写一个判断默认拥有访问某个模块的方法!至于方法是怎么实现的也很简单你要是有兴趣可以M我我告诉你!然后登陆后把那人的ID传进去,就可以得到该人能访问的模块的List然后在jsp界面循环List,动态生成菜单!这里也有点技巧毕竟有的是一级模块有的

SharePoint 2013技巧:如何隐藏Blog和Apps左侧导航菜单

企业内部网中,不需要员工创建Blog或者创建,安装SharePoint应用,因此需要在员工个人Web页面需要隐藏Blog或者Apps导航菜单, 其步骤设置如下: 该技巧适合SharePoint 2013 和Office 365. 技巧一:隐藏Blog和Apps导航链接 1. 使用具有Administrator权限的用户登录SharePoint 2. 点击"About Me" 3. 点击"Setting",然后点击"Site Settings" 4

分享14个很酷的jQuery导航菜单插件_jquery

导航按钮是网站的非常重要的一部分,因其将网站的所有部分而集中一处,jQuery导航菜单插件在其中扮演重要的角色. 本文介绍了14个很酷的jQuery导航菜单插件,它们够漂亮.简单,并且完全兼容各种类型的web浏览器. 1.Facets Navigation Demo | Download 2.Rocking & Rolling Demo | Download 3.Garage Door Menu Demo | Download 4.Little Boxes Menu Demo | Downloa

经典角色权限系统设计五张表及拓展应用

设计基础:用户.角色.权限三大核心表,加上用户角色.角色权限两个映射表(用于给用户表联系上权限表).这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限. 大致用到5张表:用户表(UserInfo).角色表(RoleInfo).菜单表(MenuInfo).用户角色表(UserRole).角色菜单表(RoleMenu). 各表的大体表结构如下: 1.用户表(UserInfo):Id.UserName.UserPwd 2.角色表(RoleInfo):Id.RoleName 3.菜单表(Me

treeview xml iframe-treeview读取xml做导航菜单不能跳转到mainframe框架中去

问题描述 treeview读取xml做导航菜单不能跳转到mainframe框架中去 index.aspx页 tree.aspx页 /asp:TreeView tree.aspx.cs protected void Page_Load(object sender, EventArgs e) { string path = @"e:s2tree.xml"; if (!IsPostBack) { InitialTreeView(this.TreeView1.Nodes, path); } }

vs2013 的 asp.net 如何配置 角色权限?

问题描述 vs2013没有了2010的asp.net配置选项,该如何配置成员角色权限呢?以前在vs2010的asp.net配置选项可以打开一个配置页面,"安全"标签里,可以配置:1使用sqlserver还是access作为注册成员.用户的后台数据库2匿名用户无法访问指定文件夹下的页面3指定用户可以访问指定文件夹下的页面配置起来相当方便但vs2013菜单-网站下面没有了asp.net配置选项,这些功能该在哪里配置,又如何配置呢?曾照网上的帖子操作,没有成功:http://blogs.ms

(转)扩展RBAC用户角色权限设计方案

扩展RBAC用户角色权限设计方案 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用户-角色-权限"的授权模型.在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系.(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体.例如:一个论坛系统,"超级管理员"."版主"都是角色.版主可管

出色的jQuery导航菜单的14个英文教程

你还没用 jQuery 写过导航菜单? 相信看到这些出色的jQuery导航菜单后,一定会为此而后悔没早点把 jQuery 应用到自己的Web开发中吧.jQuery 基本可以替代 Flash 实现Web常用的炫酷导航菜单,学习以下14篇教程,把它们应用到自己的网站项目中去吧. Codename Pufferfish 演示 Sliding Menu using jQuery 演示 How to make a smooth animated menu with jQuery 演示 Drop Down