using System.Collections.Generic; using System.Linq; using Abp.Authorization; using Abp.Dependency; using Abp.Domain.Repositories; using Abp.Localization; using Abp.MultiTenancy; using WeApp.BaseInfo; using WeApp.Configuration; using IwbZero; namespace WeApp.Authorization { public class IwbAuthorizationProvider : AuthorizationProvider { protected readonly IIocManager IocManager; public IwbAuthorizationProvider(IIocManager iocManager) { IocManager = iocManager; } public override void SetPermissions(IPermissionDefinitionContext context) { using (var funRepository = IocManager.ResolveAsDisposable>()) { var funs = funRepository.Object.GetAllList(a => a.IsDeleted == false); var topFunNo = System.Configuration.ConfigurationManager.AppSettings["SystemFunction.Top.FunctionNo"] ?? "HTSystem"; var topFun = funs.FirstOrDefault(a => a.FunctionNo == topFunNo); var topPermName = topFun?.PermissionName ?? PermissionNames.Pages; var topPermission = context.GetPermissionOrNull(topPermName) ?? context.CreatePermission(topPermName, properties: new Dictionary() { [IwbConsts.AuthPropertiesFunName] = topFun }); SetChildPermissions(topPermission, funs, topFunNo); } } private void SetChildPermissions(Permission permission, IList list, string parentNo, MultiTenancySides parentMultiTenancySide = MultiTenancySides.Tenant | MultiTenancySides.Host) { var funs = list.Where(a => a.ParentNo == parentNo).ToList(); if (funs.Any()) { foreach (var fun in funs) { permission.RemoveChildPermission(fun.PermissionName); var multiTenancySide = parentMultiTenancySide == MultiTenancySides.Host ? MultiTenancySides.Host : fun.Script != null && (fun.Script.ToLower().StartsWith("host") || fun.Script.ToLower().StartsWith("_host")) ? MultiTenancySides.Host : MultiTenancySides.Tenant | MultiTenancySides.Host; var childPermission = permission.CreateChildPermission(fun.PermissionName, L(fun.PermissionName.Replace(".", "")), multiTenancySides: multiTenancySide, properties: new Dictionary() { [IwbConsts.AuthPropertiesFunName] = fun }); SetChildPermissions(childPermission, list, fun.FunctionNo, multiTenancySide); } } } private static ILocalizableString L(string name) { return new LocalizableString(name, IwbZeroConsts.LocalizationSourceName); } } }