定义
软件多租户是一个软件架构,软件只有一个实例运行在服务器上,并服务于多个租户。一个租户包含一组用户,他们拥有指定权限,共同访问一个软件示例。一个多租户架构,应用程序未每个租户提供一个专属于他们的数据、配置、用户管理、租户特有的功能和属性。多租户通常用来创建Saas应用。
ABP多租户类库
基本定义与核心逻辑存放在Volo.ABP.MultiTenancy 内部。
针对ASP.NET Core MVC的集成则是由Volo.ABP.AspNetCore.MultiTenancy 项目实现的,针对多租户的 解析 都在这个项目内部。
租户数据的存储和管理都由Volo.ABP.TenantManagement 模块提供。
ABP 类图

ABP 多租户体现
修改示例项目代码:

Configure<AbpMultiTenancyOptions>(options =>
{options.IsEnabled = MultiTenancyConsts.IsEnabled; // IsEnabled设为True;
});

如此便启用了多租户,新建租户:

切换租户:

查看Cookie,可以看到有一个租户标记:

剖析:
Volo.Abp.TenantManagement 项目:提供一个UI界面,实现了一个租户的CRUD操作。
Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy 项目:提供了一个简单地UI界面,实现了切换租户。
在切换租户保存时,会将租户的ID写入进Cookie里面:

public async Task OnPostAsync()
{if (Input.Name.IsNullOrEmpty()){Response.Cookies.Delete(Options.TenantKey);}else{var tenant = await TenantStore.FindAsync(Input.Name);if (tenant == null){throw new UserFriendlyException(L["GivenTenantIsNotAvailable", Input.Name]);}Response.Cookies.Append(Options.TenantKey, // TenantKey = TenantResolverConsts.DefaultTenantKey; string DefaultTenantKey = "__tenant";tenant.Id.ToString(),new CookieOptions{Path = "/",HttpOnly = false,Expires = DateTimeOffset.Now.AddYears(10)});}
}

多租户应用模块
ABP中有一个默认的多租户模块 Volo.Abp.TenantManagement 项目。可以再Module文件夹中查看到该项目的源码,但是要在其他的项目中引入多租户的支持,需要实现数据种子。因为在该项目的源码有这么一个类

public class AbpTenantManagementWebMainMenuContributor : IMenuContributor
{public virtual async Task ConfigureMenuAsync(MenuConfigurationContext context){if (context.Menu.Name != StandardMenus.Main){return;}var administrationMenu = context.Menu.GetAdministration();var l = context.GetLocalizer<AbpTenantManagementResource>();var tenantManagementMenuItem = new ApplicationMenuItem(TenantManagementMenuNames.GroupName, l["Menu:TenantManagement"], icon: "fa fa-users");administrationMenu.AddItem(tenantManagementMenuItem);// 如果有权限,那么将会显示租户模块if (await context.IsGrantedAsync(TenantManagementPermissions.Tenants.Default)){tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "~/TenantManagement/Tenants"));}}
}

而权限的配置有一个单独的类来处理

public class AbpTenantManagementPermissionDefinitionProvider : PermissionDefinitionProvider
{public override void Define(IPermissionDefinitionContext context){var tenantManagementGroup = context.AddGroup(TenantManagementPermissions.GroupName, L("Permission:TenantManagement"));var tenantsPermission = tenantManagementGroup.AddPermission(TenantManagementPermissions.Tenants.Default, L("Permission:TenantManagement"), multiTenancySide: MultiTenancySides.Host);tenantsPermission.AddChild(TenantManagementPermissions.Tenants.Create, L("Permission:Create"), multiTenancySide: MultiTenancySides.Host);tenantsPermission.AddChild(TenantManagementPermissions.Tenants.Update, L("Permission:Edit"), multiTenancySide: MultiTenancySides.Host);tenantsPermission.AddChild(TenantManagementPermissions.Tenants.Delete, L("Permission:Delete"), multiTenancySide: MultiTenancySides.Host);tenantsPermission.AddChild(TenantManagementPermissions.Tenants.ManageFeatures, L("Permission:ManageFeatures"), multiTenancySide: MultiTenancySides.Host);tenantsPermission.AddChild(TenantManagementPermissions.Tenants.ManageConnectionStrings, L("Permission:ManageConnectionStrings"), multiTenancySide: MultiTenancySides.Host);}private static LocalizableString L(string name){return LocalizableString.Create<AbpTenantManagementResource>(name);}
}

PermissionDefinitionProvider 类的处理则是在 Volo.Abp.Authorization 项目中,由PermissionDefinitionManager 来处c#教程理授权 Permissions。
在项目 Volo.Abp.PermissionManagement 中处理授权Permissions 的数据种子
public class PermissionDataSeedContributor : IDataSeedContributor,


ITransientDependency
{protected ICurrentTenant CurrentTenant { get; }protected IPermissionDefinitionManager PermissionDefinitionManager { get; }protected IPermissionDataSeeder PermissionDataSeeder { get; }public PermissionDataSeedContributor(IPermissionDefinitionManager permissionDefinitionManager,IPermissionDataSeeder permissionDataSeeder,ICurrentTenant currentTenant){PermissionDefinitionManager = permissionDefinitionManager;PermissionDataSeeder = permissionDataSeeder;CurrentTenant = currentTenant;}public virtual Task SeedAsync(DataSeedContext context){var multiTenancySide = CurrentTenant.GetMultiTenancySide();var permissionNames = PermissionDefinitionManager.GetPermissions().Where(p => p.MultiTenancySide.HasFlag(multiTenancySide)).Select(p => p.Name).ToArray();return PermissionDataSeeder.SeedAsync(RolePermissionValueProvider.ProviderName,"admin",permissionNames,context.TenantId);}
}

因此,如果要集成多租户应用,只需要在XXXWebModule中生成python基础教程数据种子即可

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{var app = context.GetApplicationBuilder();// 其它code....using (var scope = context.ServiceProvider.CreateScope()){AsyncHelper.RunSync(async () =>{await scope.ServiceProvider.GetRequiredService<IDataSeeder>().SeedAsync();});}
}

由此便处理了授权,才能应用到多租户。

ABP中的多租户及多租户应用模块集成相关推荐

  1. ABP官方文档(五)【多租户】

    1.5 ABP总体介绍 - 多租户 1.5.1 什么是多租户 维基百科:"软件多租户是指一个软件架构的实例软件运行在一个服务器上,但存在多个租户.租户是一组共享一个公共的用户访问特定权限的软 ...

  2. [Abp vNext 源码分析] - 19. 多租户

    一.简介 ABP vNext 原生支持多租户体系,可以让开发人员快速地基于框架开发 SaaS 系统.ABP vNext 实现多租户的思路也非常简单,通过一个 TenantId 来分割各个租户的数据,并 ...

  3. Blazor服务器应用程序中使用EF Core的多租户

    目录 工厂生命周期 一种方法 把事情放在上下文中 依赖的生命周期 transient事件 性能说明 许多业务应用程序旨在与多个客户合作.保护数据安全很重要,这样客户数据就不会被其他客户和潜在竞争对手泄 ...

  4. 云管平台中租户以及多租户概念简单说明

    随着云计算兴起,上云企业的增加,云管平台的作用越来越明显.但大家对于云管平台中一些名词还不是很清楚,现在我们就来简单说一下云管平台中租户以及多租户概念. 云管平台中租户的概念 云管平台中的租户是一个逻 ...

  5. openstack租户管理_openstack 租户、用户管理

    创建domain [root@cc01 ~]# openstack domain create --description "Default Domain" default +-- ...

  6. ABP架构学习系列二:ABP中配置的注册和初始化

    一.手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp.Abp.Web.Abp.Web.Mvc.Abp.Web.Api 使用nuget添加Newtonsoft.Json.Castle.Cor ...

  7. ABP中的数据过滤器

      本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant),然后介绍了如何实现一个自定义过滤器,最后介绍了在软件开发过程中遇到的实际问题,同时给出了 ...

  8. ABP中的AsyncCrudAppService介绍

    前言 在更新vue项目模板的示例代码时,感觉有必要讲解下ABP中的AsyncCrudAppService<>怎么用. 跟我做 先自卖自夸一下,只要你本地有装dotnet环境,就可以跟着我一 ...

  9. (译)创建.NET Core多租户应用程序-租户解析

    介绍 本系列博客文章探讨了如何在ASP.NET Core Web应用程序中实现多租户.这里有很多代码段,因此您可以按照自己的示例应用程序进行操作.在此过程的最后,没有对应的NuGet程序包,但这是一个 ...

最新文章

  1. Uva 10562 看图写树
  2. C语言实例:将人员信息写入磁盘文件并读出显示
  3. java并发编程实践学习---java的类锁和对象锁
  4. 小孔成像实验探究的软件_小孔成像法观察日食
  5. SCCM2007系列教程之八资产管理
  6. ContentPresenter
  7. 滚动图片广告_女排赢球可喜看台马桶广告扎眼 网友:去男足赛场!别在这儿蹭热点...
  8. autotools工具介绍
  9. RabbitMQ三种Exchange
  10. python pickle模块详解
  11. oracle imp 换表空间,imp导入切换表空间
  12. 电阻元件、电感元件、电容元件
  13. 台式计算机没有声音,我们家台式电脑没有声音,该怎样设置
  14. 华为p4支持鸿蒙功能吗_华为鸿蒙系统支持哪些手机 鸿蒙系统支持以前的华为手机吗...
  15. [转]在线生成条形码(39码、EAN-13)
  16. 在centos7系统安装docker及用docker安装jenkins
  17. http-server
  18. 硬盘知识大全(含主板、BIOS)
  19. krig matlab,EasyKrig_V3.0_Matlab2016b
  20. 白月黑羽教python之selenium:课后练习

热门文章

  1. IDM下载百度网盘内容
  2. PRE、RC、beta、RTM 含义扫盲
  3. Python量化交易实战-40easytrader开发环境安装
  4. 「国家战略科学家」身份!AI学者朱松纯加盟清华筹建通用AI研究院
  5. 《改变你一生的108个心理学法则》
  6. python和树莓派_用 Linux、Python 和树莓派酿制啤酒
  7. 黑马57期黑马旅游网之03登录和退出功能_22登录功能姓名提示_姓名提示不能正常显示
  8. VB 控件分类----内部控件;ActiveX 控件;可插入的对象
  9. web加减乘除法c#_c#实战  计算器(支持加减乘除括号的混合计算)
  10. 记忆网络之Memory Networks