using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Abp; using Abp.Application.Features; using Abp.Authorization; using Abp.Collections.Extensions; using Abp.Dependency; using Abp.Domain.Repositories; using Abp.MultiTenancy; using Abp.Runtime.Session; using IwbZero.Authorization.Users; using IwbZero.BaseSysInfo; namespace IwbZero.Authorization.Permissions { /// /// Permission manager. /// public class IwbPermissionManager : IwbPermissionDefinitionContextBase, IIwbPermissionManager, ISingletonDependency where TUser:IwbSysUser where TFun:IwbSysFunction { public IAbpSession AbpSession { get; set; } protected readonly IIocManager IocManager; /// /// Constructor. /// public IwbPermissionManager(IIocManager iocManager) { IocManager = iocManager; AbpSession = NullAbpSession.Instance; } public virtual void Initialize() { using (var funRepository = IocManager.ResolveAsDisposable>()) { var funs = funRepository.Object.GetAllList(a => a.IsDeleted == false); Initialize(funs); } } public virtual void Initialize(List funs) { var topFunNo = System.Configuration.ConfigurationManager.AppSettings["SystemFunction.Top.FunctionNo"] ?? "HTSystem"; var topFun = funs.FirstOrDefault(a => a.FunctionNo == topFunNo); var topPermName = topFun?.PermissionName ?? "Pages"; var topPermission = GetPermissionOrNull(topPermName) ?? CreatePermission(topPermName); AddChildPermission(topPermission, funs, topFunNo); Permissions.AddAllPermissions(); } public virtual Permission AddChildPermission(Permission permission, List funs, string parentFunNo) { var childFuns = funs.Where(a => a.ParentNo == parentFunNo); foreach (var f in childFuns) { var childPermssion = permission.CreateChildPermission(f.PermissionName); AddChildPermission(childPermssion, funs, f.FunctionNo); } return permission; } public virtual Permission GetPermission(string name) { var permission = Permissions.GetOrDefault(name); if (permission == null) { throw new AbpException("There is no permission with name: " + name); } return permission; } public virtual IReadOnlyList GetAllPermissions(bool tenancyFilter = true) { using (var featureDependencyContext = IocManager.ResolveAsDisposable()) { var featureDependencyContextObject = featureDependencyContext.Object; return Permissions.Values .WhereIf(tenancyFilter, p => p.MultiTenancySides.HasFlag(AbpSession.MultiTenancySide)) .Where(p => p.FeatureDependency == null || AbpSession.MultiTenancySide == MultiTenancySides.Host || p.FeatureDependency.IsSatisfied(featureDependencyContextObject) ).ToImmutableList(); } } public virtual IReadOnlyList GetAllPermissions(MultiTenancySides multiTenancySides) { using (var featureDependencyContext = IocManager.ResolveAsDisposable()) { var featureDependencyContextObject = featureDependencyContext.Object; return Permissions.Values .Where(p => p.MultiTenancySides.HasFlag(multiTenancySides)) .Where(p => p.FeatureDependency == null || AbpSession.MultiTenancySide == MultiTenancySides.Host || (p.MultiTenancySides.HasFlag(MultiTenancySides.Host) && multiTenancySides.HasFlag(MultiTenancySides.Host)) || p.FeatureDependency.IsSatisfied(featureDependencyContextObject) ).ToImmutableList(); } } } }