using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Abp.Application.Features; using Abp.Collections.Extensions; using Abp.Configuration.Startup; using Abp.Dependency; using Abp.MultiTenancy; using Abp.Runtime.Session; namespace Abp.Authorization { /// /// Permission manager. /// internal class PermissionManager : PermissionDefinitionContextBase, IPermissionManager, ISingletonDependency { public IAbpSession AbpSession { get; set; } private readonly IIocManager _iocManager; private readonly IAuthorizationConfiguration _authorizationConfiguration; /// /// Constructor. /// public PermissionManager( IIocManager iocManager, IAuthorizationConfiguration authorizationConfiguration) { _iocManager = iocManager; _authorizationConfiguration = authorizationConfiguration; AbpSession = NullAbpSession.Instance; } public void Initialize() { foreach (var providerType in _authorizationConfiguration.Providers) { using (var provider = _iocManager.ResolveAsDisposable(providerType)) { provider.Object.SetPermissions(this); } } Permissions.AddAllPermissions(); } public 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 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 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(); } } } }