using System; using System.Collections.Generic; using System.Collections.Immutable; using Abp.Application.Features; using Abp.Localization; using Abp.MultiTenancy; namespace Abp.Authorization { /// /// Represents a permission. /// A permission is used to restrict functionalities of the application from unauthorized users. /// public class Permission { /// /// Parent of this permission if one exists. /// If set, this permission can be granted only if parent is granted. /// public Permission Parent { get; private set; } /// /// Unique name of the permission. /// This is the key name to grant permissions. /// public string Name { get; } /// /// Display name of the permission. /// This can be used to show permission to the user. /// public ILocalizableString DisplayName { get; set; } /// /// A brief description for this permission. /// public ILocalizableString Description { get; set; } /// /// Which side can use this permission. /// public MultiTenancySides MultiTenancySides { get; set; } /// /// Depended feature(s) of this permission. /// public IFeatureDependency FeatureDependency { get; set; } /// /// List of child permissions. A child permission can be granted only if parent is granted. /// public IReadOnlyList Children => _children.ToImmutableList(); private readonly List _children; /// /// Creates a new Permission. /// /// Unique name of the permission /// Display name of the permission /// A brief description for this permission /// Which side can use this permission /// Depended feature(s) of this permission public Permission( string name, ILocalizableString displayName = null, ILocalizableString description = null, MultiTenancySides multiTenancySides = MultiTenancySides.Host | MultiTenancySides.Tenant, IFeatureDependency featureDependency = null) { if (name == null) { throw new ArgumentNullException("name"); } Name = name; DisplayName = displayName; Description = description; MultiTenancySides = multiTenancySides; FeatureDependency = featureDependency; _children = new List(); } /// /// Adds a child permission. /// A child permission can be granted only if parent is granted. /// /// Returns newly created child permission public Permission CreateChildPermission( string name, ILocalizableString displayName = null, ILocalizableString description = null, MultiTenancySides multiTenancySides = MultiTenancySides.Host | MultiTenancySides.Tenant, IFeatureDependency featureDependency = null) { var permission = new Permission(name, displayName, description, multiTenancySides, featureDependency) { Parent = this }; _children.Add(permission); return permission; } public void RemoveChildPermission(string name) { _children.RemoveAll(p => p.Name == name); } public override string ToString() { return string.Format("[Permission: {0}]", Name); } } }