在从 UI (ABP.IO) 创建租户的过程中创建新角色(通过代码)

Posted

技术标签:

【中文标题】在从 UI (ABP.IO) 创建租户的过程中创建新角色(通过代码)【英文标题】:Creating new Role (by code) during the Tenant creation process from UI (ABP.IO) 【发布时间】:2021-03-20 14:01:48 【问题描述】:

我正在尝试在 ABP.IO 框架版本 4 上从 UI 创建新租户时添加角色的创建。

从 ABP.IO 文档中,我发现通过使用现有的 SaasDataSeedContributor 类,我可以在创建新租户时“播种”一些数据。

我的问题是,在这个类中,我没有使用 IIdentityRoleAppService.CreateAsync 方法的权限(未授予给定策略)。 因此,我尝试通过 AppService 并使用 IdentityRoleManager 甚至 IIdentityRoleRepository,但由于其保护级别,构造函数无法访问,因此无法创建 IdentityRole 对象。

有没有想过?在使用 SaasDataSeedContributor 创建租户 appart 时,是否还有其他方法可以执行操作。或者我在这里做错了什么。

感谢您的帮助

【问题讨论】:

我实际上找到了不受保护的构造函数:IdentityRole(Guid Id, string Name, [Guid?tenantId = null]),所以我直接在 SaasDataSeedContributor 类上使用 IdentityRoleManager,现在一切正常。 请不要在其他服务中使用ApplicationServices 是的,谢谢,我实际上在 SaasDataSeedContributor 中使用 IdentityRoleManager,它是一个类而不是服务。 【参考方案1】:

试试这个。

public class AppRolesDataSeedContributor : IDataSeedContributor, ITransientDependency

    private readonly IGuidGenerator _guidGenerator;
    private readonly IdentityRoleManager _identityRoleManager;

    public AppRolesDataSeedContributor(IGuidGenerator guidGenerator, IdentityRoleManager identityRoleManager)
    
        _guidGenerator = guidGenerator;
        _identityRoleManager = identityRoleManager;
    


    public async Task SeedAsync(DataSeedContext context)
    
        if (context.TenantId.HasValue)
        
            // try this for a single known role
            var role = await _identityRoleManager.FindByNameAsync("new_role");
            if (role == null)
            
                var identityResult = await _identityRoleManager.CreateAsync(
                    new IdentityRole(_guidGenerator.Create(), "new_role", context.TenantId.Value));
            


            // or this (not tested) for multiple roles
            /*
             var newRoles = new[]  "role1", "role2" ;

            var identityRoles = from r
                    in _identityRoleManager.Roles
                where r.TenantId == context.TenantId.Value
                select r.Name;

            var except = newRoles.Except(identityRoles.ToList());
            foreach (var name in except)
            
                var identityResult = await _identityRoleManager.CreateAsync(
                    new IdentityRole(_guidGenerator.Create(), name, context.TenantId.Value));
            
            */

        

    

【讨论】:

以上是关于在从 UI (ABP.IO) 创建租户的过程中创建新角色(通过代码)的主要内容,如果未能解决你的问题,请参考以下文章

在 Snowflake UI 中创建环境变量文件

我如何将带有数据的模型从数据库传递到 ABP.IO 布局挂钩?

AWS-CLI:在从快照创建的现有集群中创建 RDS Aurora 数据库实例

在从作业中创建 pos 时,由于并发更新而无法序列化访问

重新设计 Abp.IdentityServer 的 UI(身份服务器 4)

如何在 Flutter 中创建三角形 UI