亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷综合久久久久中文字幕1| 欧美成人午夜剧场免费观看| 精品二区三区线观看| 亚洲bt欧美bt日本bt| 麻豆一区二区在线观看| 久久激情视频久久| 日韩av片电影专区| 日韩免费高清在线观看| 欧美视频精品一区| 在线播放日韩欧美| 亚洲精品视频中文字幕| 国产欧美日韩中文字幕在线| 川上优av一区二区线观看| 伊人久久久久久久久久久久久| 欧美裸身视频免费观看| 国产精品日韩精品| 欧美成人在线免费| 欧美一级大片在线观看| 久久久久久国产精品久久| 日韩欧美亚洲范冰冰与中字| 在线播放国产一区二区三区| 欧美性猛交xxxx偷拍洗澡| 午夜精品蜜臀一区二区三区免费| 亚洲直播在线一区| 国产精品美女在线| 91av在线播放视频| 欧美激情亚洲另类| 日韩激情片免费| 成人久久精品视频| 亚洲va国产va天堂va久久| 国产精品极品美女在线观看免费| 日韩国产精品一区| 欧美电影第一页| 精品亚洲一区二区三区在线播放| 韩国美女主播一区| 亚洲欧洲中文天堂| 亚洲精品在线观看www| 亚洲一区二区三区乱码aⅴ| 国产精品久久视频| 欧美成人小视频| 91在线免费网站| 成人精品网站在线观看| 日韩暖暖在线视频| 久久久精品久久久| 日韩亚洲国产中文字幕| 久久久久久亚洲精品中文字幕| 久久777国产线看观看精品| 欧美激情一级欧美精品| 久久精品国产欧美激情| 91沈先生作品| 国产精品99久久久久久久久| 日韩精品极品视频| 大荫蒂欧美视频另类xxxx| 成人h视频在线| 国产成人精品久久亚洲高清不卡| 日韩欧美一区二区三区久久| 亚洲精品乱码久久久久久按摩观| 亚洲最大福利视频| 欧美影院在线播放| 国产精品网红福利| 亚洲国产欧美一区二区三区同亚洲| 少妇高潮久久77777| 久久精品影视伊人网| 成人久久久久久久| 欧美日韩一二三四五区| 国产欧美在线播放| 中文日韩在线观看| 九九热最新视频//这里只有精品| 日韩av一区在线| 蜜臀久久99精品久久久久久宅男| 亚洲3p在线观看| 欧美日韩国产丝袜美女| 九九精品视频在线| 午夜精品久久久久久久男人的天堂| 久久免费国产精品1| 日韩欧亚中文在线| 成人精品福利视频| 成人国产精品免费视频| 国产精品视频一区二区高潮| 日韩av网站导航| 91高潮精品免费porn| 国产欧美一区二区三区在线| 精品无人区太爽高潮在线播放| 国产精品亚发布| 欧美一区二区三区……| 欧美性视频网站| 久久久久国产精品一区| 92福利视频午夜1000合集在线观看| 久久综合久中文字幕青草| 爽爽爽爽爽爽爽成人免费观看| 日韩激情在线视频| 国产精品观看在线亚洲人成网| 亚洲精品久久久久久久久久久久久| 亚洲一区制服诱惑| 久久久精品视频在线观看| 乱亲女秽乱长久久久| 欧美在线观看网站| 亚洲天堂网在线观看| 欧美午夜激情小视频| 久久精品色欧美aⅴ一区二区| 92看片淫黄大片欧美看国产片| 在线日韩精品视频| 欧洲成人免费aa| 亚洲精品国产美女| 欧美性猛交xxxx免费看久久久| 精品国产一区二区三区四区在线观看| 国产色综合天天综合网| 日韩欧美精品网站| 日韩中文字幕欧美| 精品亚洲国产成av人片传媒| 日韩精品高清在线观看| 久久99热精品这里久久精品| 亚洲午夜久久久影院| 欧美黄色三级网站| 国产精欧美一区二区三区| 亚洲男人天堂视频| 成人午夜高潮视频| 国产精品久久久久一区二区| 成人午夜在线影院| 黄色一区二区三区| 中文字幕在线看视频国产欧美| 亚洲美女性视频| 福利二区91精品bt7086| 亚洲人在线观看| 日本欧美黄网站| 精品久久久久久国产| 久久精品91久久香蕉加勒比| 91国产在线精品| 亚洲欧美日韩视频一区| 亚洲电影免费观看高清完整版在线观看| 亚洲欧美一区二区三区情侣bbw| 欧美不卡视频一区发布| 欧美乱妇高清无乱码| 欧美壮男野外gaytube| 久久久久久这里只有精品| 日本中文字幕不卡免费| 成人亚洲激情网| 精品福利一区二区| 久久久久久av| 97精品免费视频| 欧美多人爱爱视频网站| 国产999在线观看| 亚洲变态欧美另类捆绑| 亚洲日本aⅴ片在线观看香蕉| 尤物精品国产第一福利三区| 欧美成人黑人xx视频免费观看| 日韩欧美在线免费| yw.139尤物在线精品视频| 91免费视频国产| 国产z一区二区三区| 久久久免费电影| 欧美另类极品videosbestfree| 日韩久久免费电影| 91免费国产网站| 亚洲欧美日韩精品| 欧美激情久久久久久| 午夜精品久久久久久久99热浪潮| 成人黄色免费网站在线观看| 欧洲成人免费视频| 久久精品国产96久久久香蕉| 亚洲精品久久久一区二区三区| 国产丝袜一区二区三区免费视频| 精品视频偷偷看在线观看| 欧美在线视频一二三|