Skip to content

Permission Provider

  • Do define <ModuleName>Consts at domain shared package.
public static class ProjectConsts
{
    public const string GroupName = "ProjectPlanning";
}
  • Do define permission provider in the application contracts package.
  • Do provide tenant logic in order to handle multi tenant requirement.
  • Do integrate with permission with feature management.
public class ProjectPlanningPermissionDefinitionProvider : PermissionDefinitionProvider
{
    public override void Define(IPermissionDefinitionContext context)
    {
        var tenancyStatus = context.ServiceProvider.GetRequiredService<IOptions<AbpMultiTenancyOptions>>().Value.IsEnabled;

        var projectPlanningPermissionGroup = context.AddGroup(
            name: ProjectPlanningPermissions.GroupName,
            displayName: L("Permission:ProjectPlanning")
        );

        #region BaseModel 
        var baseModelPermission = projectPlanningPermissionGroup.AddPermission(
            name: ProjectPlanningPermissions.BaseModel.Permission,
            displayName: L("Permission:BaseModel"), // localization string
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true // by default is activated
        ).RequireFeatures(ProjectPlanningFeatures.Enable);

        baseModelPermission.AddChild(
            name: ProjectPlanningPermissions.BaseModel.Assign,
            displayName: L("Permission:BaseModel:Assign"),
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true
        ).RequireFeatures(ProjectPlanningFeatures.Enable);
        #endregion

        #region Project
        var projectManagementPermission = projectPlanningPermissionGroup.AddPermission(
            name: ProjectPlanningPermissions.Project.Permission,
            displayName: L("Permission:Project"), // localization string
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true // by default is activated
        ).RequireFeatures(ProjectPlanningFeatures.Enable);

        projectManagementPermission.AddChild(
            name: ProjectPlanningPermissions.Project.Create,
            displayName: L("Permission:Project:Create"),
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true
        ).RequireFeatures(ProjectPlanningFeatures.Enable);

        projectManagementPermission.AddChild(
            name: ProjectPlanningPermissions.Project.Edit,
            displayName: L("Permission:Project:Edit"),
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true
        ).RequireFeatures(ProjectPlanningFeatures.Enable);

        projectManagementPermission.AddChild(
            name: ProjectPlanningPermissions.Project.Assign,
            displayName: L("Permission:Project:Assign"),
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true
        ).RequireFeatures(ProjectPlanningFeatures.Enable);

        projectManagementPermission.AddChild(
            name: ProjectPlanningPermissions.Project.ChangeOwner,
            displayName: L("Permission:Project:ChangeOwner"),
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true
        ).RequireFeatures(ProjectPlanningFeatures.Enable);

        projectManagementPermission.AddChild(
            name: ProjectPlanningPermissions.Project.Delete,
            displayName: L("Permission:Project:Delete"),
            multiTenancySide: tenancyStatus == true ? MultiTenancySides.Tenant : MultiTenancySides.Both,
            isEnabled: true
        ).RequireFeatures(ProjectPlanningFeatures.Enable);
        #endregion
  • Do define permission for each aggregate
  • Do provide base crud operation permissions
public class ProjectPlanningPermissions
{
    public const string GroupName = ProjectConsts.GroupName;

    public static class Project
    {
        public const string Permission = GroupName + ".Project"; // ProjectPlanning.Project
        public const string Create = Permission + ".Create";
        public const string Edit = Permission + ".Edit";
        public const string Assign = Permission + ".Assign";
        public const string ChangeOwner = Permission + ".Change.Owner";
        public const string Delete = Permission + ".Delete";  // ProjectPlanning.Project.Delete
    }

    public static class BaseModel
    {
        public const string Permission = GroupName + ".BaseModel";
        public const string Assign = Permission + ".Assign";
    }
}
  • Do create reflection helpers to read permission details
public static string[] GetProject()
{
    return ReflectionHelper.GetPublicConstantsRecursively(typeof(Project));
}

public static string[] GetPhase()
{
    return ReflectionHelper.GetPublicConstantsRecursively(typeof(Phase));
}

public static string[] GetAll()
{
    return new List<string>()
                   .Concat(GetBaseModel())
                   .Concat(GetProject())
                   .ToArray();
}