麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

ABP 初探 之 權限設計

2019-11-17 02:11:04
字體:
來源:轉載
供稿:網友

ABP 初探 之 權限設計

大、小項目都要設計權限,都想設計一個通用的權限,把權限做的比較復雜,現在了解了ABP的設計思路,覺得設計很簡單,但實現方法與思路耐人尋味。

  本篇只介紹AbpPermissions的數據庫設計,其它表結構參考源代碼即可[Name(資源文件唯一Id)]、[IsGranted(是否授權)]、[RoleId、UserId(授權于角色或用戶)]

  ABP所有常量數據,都是程序啟動時通過AbpKernelModule一次性加載完成,用的時候直接從內存中讀取即可

public override void PostInitialize()        {            RegisterMissingComponents();            IocManager.Resolve<LocalizationManager>().Initialize();  //初始化資源文件            IocManager.Resolve<NavigationManager>().Initialize();   //初始化導航權限            IocManager.Resolve<PermissionManager>().Initialize();  //初始化操作權限            IocManager.Resolve<SettingDefinitionManager>().Initialize();        }

  權限分為前臺權限判斷和后臺權限判斷兩種情況JS判斷權限是通過引用<script src="~/AbpScripts/GetScripts" type="text/javascript"></script> 這個腳本,把相關JS對象與方法加載到JS文件

  

  上圖中有兩個紅框,是后臺構建的兩個導航,MainMenu是系統默認的屬性,Test是自定義屬性,如下代碼

public class ModuleZeroSamplePRojectNavigationProvider : NavigationProvider    {        public override void SetNavigation(INavigationProviderContext context)        {            SetNavigation1(context);            SetTestNavigation(context);        }        private void SetNavigation1(INavigationProviderContext context)        {            context.Manager.MainMenu   //默認導航屬性                .AddItem(                    new MenuItemDefinition(                        "Questions",                        new LocalizableString("Questions", ModuleZeroSampleProjectConsts.LocalizationSourceName),                        url: "#/questions",                        icon: "fa fa-question",                        requiredPermissionName: "Questions"  //根據變量進行權限判斷                        )                ).AddItem(                    new MenuItemDefinition(                        "Users",                        new LocalizableString("Users", ModuleZeroSampleProjectConsts.LocalizationSourceName),                        url: "#/users",                        icon: "fa fa-users"                        )                );        }        public const string TestName = "Test";  //自定義導航屬性        private void SetTestNavigation(INavigationProviderContext context)        {            var testMenu = new MenuDefinition(TestName, new FixedLocalizableString("Frontend menu"));            context.Manager.Menus[TestName] = testMenu;            testMenu               .AddItem(                    new MenuItemDefinition(                        "Questions",                        new LocalizableString("Questions", ModuleZeroSampleProjectConsts.LocalizationSourceName),                        url: "#/questions",                        icon: "fa fa-question"                        )                ).AddItem(                    new MenuItemDefinition(                        "Users",                        new LocalizableString("Users", ModuleZeroSampleProjectConsts.LocalizationSourceName),                        url: "#/users",                        icon: "fa fa-users"                        )                );        }    }
View Code

  JS代碼是通過NavigationScriptManager 類的GetScriptAsync()進行加載與權限進行判斷,獲取導航數據通過abp.nav.menus.MainMenu

public async Task<IReadOnlyList<UserMenu>> GetMenusAsync(long? userId)    //根據當前用戶加載相關導航        {            var userMenus = new List<UserMenu>();            foreach (var menu in _navigationManager.Menus.Values)  // 默認初始化的所有 導航屬性            {                userMenus.Add(await GetMenuAsync(menu.Name, userId));            }            return userMenus;        }        private async Task<int> FillUserMenuItems(long? userId, IList<MenuItemDefinition> menuItemDefinitions, IList<UserMenuItem> userMenuItems)        {            var addedMenuItemCount = 0;            foreach (var menuItemDefinition in menuItemDefinitions)            {                if (menuItemDefinition.RequiresAuthentication && !userId.HasValue)                {                    continue;                }                if (!string.IsNullOrEmpty(menuItemDefinition.RequiredPermissionName) && (!userId.HasValue || !(await PermissionChecker.IsGrantedAsync(userId.Value, menuItemDefinition.RequiredPermissionName))))  //根據當前用戶Id和權限判斷當前用戶是否有導航權限                {                    continue;                }                var userMenuItem = new UserMenuItem(menuItemDefinition);                if (menuItemDefinition.IsLeaf || (await FillUserMenuItems(userId, menuItemDefinition.Items, userMenuItem.Items)) > 0)   //遞歸加載層級導航                {                    userMenuItems.Add(userMenuItem);                    ++addedMenuItemCount;                }            }            return addedMenuItemCount;        }
View Code

  abp.js 定義了很多方法與屬性,用戶判斷權限的是abp.auth.haspermission(),該方法的參數是 后臺Action對應的操作權限,如果該方法返回值為True,則說明當前用戶被授予了權限。

  前臺JS通過AuthorizationScriptManager 類的 GetScript 方法 加載所有權限及當前用戶的權限

 public async Task<string> GetScriptAsync()        {            var allPermissionNames = _permissionManager.GetAllPermissions(false).Select(p => p.Name).ToList();  //獲取所有權限            var grantedPermissionNames = new List<string>();            if (Abpsession.UserId.HasValue)            {                foreach (var permissionName in allPermissionNames)                {                    if (await PermissionChecker.IsGrantedAsync(AbpSession.UserId.Value, permissionName))                    {                        grantedPermissionNames.Add(permissionName);  // 獲取當前用戶的權限                    }                }            }                        var script = new StringBuilder();            script.AppendLine("(function(){");            script.AppendLine();            script.AppendLine("    abp.auth = abp.auth || {};");            script.AppendLine();            AppendPermissionList(script, "allPermissions", allPermissionNames);            script.AppendLine();            AppendPermissionList(script, "grantedPermissions", grantedPermissionNames);            script.AppendLine();            script.Append("})();");            return script.ToString();        }
View Code

  權限初始化定義需集成AuthorizationProvider,如下

public class ModuleZeroSampleProjectAuthorizationProvider : AuthorizationProvider    {        public override void SetPermissions(IPermissionDefinitionContext context)        {            //TODO: Localize (Change FixedLocalizableString to LocalizableString)            context.CreatePermission("CanCreateQuestions", new Fi
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成人毛片100免费观看 | 中文字幕网在线 | 性少妇chinesevideo | 欧美性色大片 | 黄色网页在线看 | 国产精品美女久久久免费 | 杏美月av| 91久久久国产精品 | 国产在线色 | 黄片毛片一级 | 中文字幕在线网 | 精品国产一区二区三区四区在线 | 精品国产观看 | 日本在线国产 | 日韩高清电影 | 99ri在线 | 空姐一级毛片 | 国产成人小视频在线观看 | 亚洲人成中文字幕在线观看 | 国产精品久久久久永久免费 | 亚洲第一成av人网站懂色 | 黄色免费播放网站 | 特级a欧美做爰片毛片 | 国产1区2区在线观看 | 国产成人精品区一区二区不卡 | 91丝袜| 欧美重口另类videos人妖 | 精品一区二区久久久久久久网精 | 亚洲最大久久 | 久久中文一区 | 国产一级91| 欧美成人精品一区二区 | 国产乱淫a∨片免费观看 | 午夜视频在线免费 | 国产91一区二区三区 | 免费观看高清视频网站 | 91福利国产在线观一区二区 | 欧美在线观看黄色 | 成人18在线 | 成年人视频免费 | 久久精品视频黄色 |