Open Closed

Need data seeder to add roles and pre-defined permissions #7179


User avatar
0
mahsundag created

Hi,

I want to create a data seeder to add roles and pre-defined permissions.

So, I plan to include two new custom roles and their corresponding permissions.

For instance, "Employer" and "Contractor" as roles, and permissions to access Blazor pages.

I require a step-by-step solution, preferably with existing code tailored to my needs.

Adding a new user and setting existing roles with predefined permissions is my goal.

  • ABP Framework version: v8.0.4
  • UI Type: Blazor Server
  • Database System: EF Core (PostgreSQL)
  • Tiered (for MVC) or Auth Server Separated (for Angular): no
  • Exception message and full stack trace:
  • Steps to reproduce the issue:
Markdown supported.
Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)

1 Answer(s)
  • User Avatar
    0
    maliming created
    Support Team Fullstack Developer

    hi

    A DataSeedContributor to add two roles and add all permissions to these roles.

    You can give it a try.

    https://docs.abp.io/en/abp/latest/Data-Seeding

    using System;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Identity;
    using Microsoft.Extensions.Options;
    using Volo.Abp.Authorization.Permissions;
    using Volo.Abp.Data;
    using Volo.Abp.DependencyInjection;
    using Volo.Abp.Guids;
    using Volo.Abp.Identity;
    using Volo.Abp.MultiTenancy;
    using Volo.Abp.PermissionManagement;
    using Volo.Abp.Uow;
    
    public class MyDataSeedContributor : IDataSeedContributor, ITransientDependency
    {
        protected IGuidGenerator GuidGenerator { get; }
        protected IIdentityRoleRepository RoleRepository { get; }
        protected IIdentityUserRepository UserRepository { get; }
        protected ILookupNormalizer LookupNormalizer { get; }
        protected IdentityUserManager UserManager { get; }
        protected IdentityRoleManager RoleManager { get; }
        protected ICurrentTenant CurrentTenant { get; }
        protected IOptions<IdentityOptions> IdentityOptions { get; }
        protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
        protected IPermissionDataSeeder PermissionDataSeeder { get; }
    
        public MyDataSeedContributor(
            IGuidGenerator guidGenerator,
            IIdentityRoleRepository roleRepository,
            IIdentityUserRepository userRepository,
            ILookupNormalizer lookupNormalizer,
            IdentityUserManager userManager,
            IdentityRoleManager roleManager,
            ICurrentTenant currentTenant,
            IOptions<IdentityOptions> identityOptions,
            IPermissionDefinitionManager permissionDefinitionManager,
            IPermissionDataSeeder permissionDataSeeder)
        {
            GuidGenerator = guidGenerator;
            RoleRepository = roleRepository;
            UserRepository = userRepository;
            LookupNormalizer = lookupNormalizer;
            UserManager = userManager;
            RoleManager = roleManager;
            CurrentTenant = currentTenant;
            IdentityOptions = identityOptions;
            PermissionDefinitionManager = permissionDefinitionManager;
            PermissionDataSeeder = permissionDataSeeder;
        }
    
        [UnitOfWork]
        public virtual async Task SeedAsync(DataSeedContext context)
        {
            var tenantId = context.TenantId;
            using (CurrentTenant.Change(tenantId))
            {
                await IdentityOptions.SetAsync();
    
                // "Employer" and "Contractor" roles
                const string employerRoleName = "Employer";
                const string contractorRoleName = "Contractor";
    
                var employerRoleNameRole = await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(employerRoleName));
                if (employerRoleNameRole == null)
                {
                    employerRoleNameRole = new IdentityRole(GuidGenerator.Create(), employerRoleName, tenantId)
                    {
                        IsPublic = true
                    };
    
                    (await RoleManager.CreateAsync(employerRoleNameRole)).CheckErrors();
                }
    
                var contractorRoleNameRole = await RoleRepository.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName(contractorRoleName));
                if (contractorRoleNameRole == null)
                {
                    contractorRoleNameRole = new IdentityRole(GuidGenerator.Create(), contractorRoleName, tenantId)
                    {
                        IsPublic = true
                    };
    
                    (await RoleManager.CreateAsync(contractorRoleNameRole)).CheckErrors();
                }
    
                var yourUser = await UserRepository.FindAsync(Guid.NewGuid());//your user id
    
                (await UserManager.AddToRoleAsync(yourUser, employerRoleName)).CheckErrors();
                (await UserManager.AddToRoleAsync(yourUser, contractorRoleName)).CheckErrors();
    
                var multiTenancySide = CurrentTenant.GetMultiTenancySide();
                var allPermissionNames = (await PermissionDefinitionManager.GetPermissionsAsync())
                    .Where(p => p.MultiTenancySide.HasFlag(multiTenancySide))
                    .Select(p => p.Name)
                    .ToArray();
    
                await PermissionDataSeeder.SeedAsync(
                    RolePermissionValueProvider.ProviderName,
                    employerRoleName,
                    allPermissionNames,
                    context?.TenantId
                );
    
                await PermissionDataSeeder.SeedAsync(
                    RolePermissionValueProvider.ProviderName,
                    contractorRoleName,
                    allPermissionNames,
                    context?.TenantId
                );
            }
        }
    }
    
    
    Markdown supported.
    Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on September 09, 2026, 11:56
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.