大、小项目都要设计权限,都想设计一个通用的权限,把权限做的比较复杂,现在了解了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文件

  ABP 初探 之 权限设计

  上图中有两个红框,是后台构建的两个导航,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

相关文章: