一、集成

1、引用安装包

Volo.Abp.AspNetCore.MultiTenancy

2、配置租户key

Configure<AbpAspNetCoreMultiTenancyOptions>(options =>
{
options.TenantKey = "BridgeTenantKey"; });

3、在代码中写入所有租户,当在也可以在配置文件或数据库中定义你的所有租户

 Configure<AbpDefaultTenantStoreOptions>(options =>
{ options.Tenants = new[]
{
new TenantConfiguration(
Guid.Parse("446a5211-3d72-4339-9adc-845151f8ada0"), //Id
"tenant1" //Name
),
new TenantConfiguration(
Guid.Parse("25388015-ef1c-4355-9c18-f6b6ddbaf89d"), //Id
"tenant2" //Name
) };
});

4、开启租户

Configure<AbpMultiTenancyOptions>(options =>
{
options.IsEnabled = true;
});

5、配置租户中间件

app.UseMultiTenancy();

6、最后访问服务会报错:

<body>
<h3>找不到租户!</h3>
无法找到ID或名称为446a5211-3d72-4339-9adc-845151f8ada0的租户<br>
</body>

二、租户源原码解析

1、那就从中间件UseMultiTenancy()开始切入

在该方法中注入了一个中间件:MultiTenancyMiddleware,在该方法中有一个方法InvokeAsync

进入_tenantConfigurationProvider的实现TenantConfigurationProvider中,查看GetAsync()方法

在该方法中只做了两件事

一是从请求头中解析租户信息:TenantResolver.ResolveTenantIdOrNameAsync();

解析租户信息是从我们注入的几个类中依次解析直到拿表租户信息,有从请求头,有从cookie中

public class AbpAspNetCoreMultiTenancyModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpTenantResolveOptions>(options =>
{
options.TenantResolvers.Add(new QueryStringTenantResolveContributor());
options.TenantResolvers.Add(new RouteTenantResolveContributor());
options.TenantResolvers.Add(new HeaderTenantResolveContributor());
options.TenantResolvers.Add(new CookieTenantResolveContributor());
});
}
}

二是将解析出的租户信息与系统中配置的租户信息匹配:await FindTenantAsync(resolveResult.TenantIdOrName);

protected virtual async Task<TenantConfiguration?> FindTenantAsync(string tenantIdOrName)
{
if (Guid.TryParse(tenantIdOrName, out var parsedTenantId))
{
return await TenantStore.FindAsync(parsedTenantId);
}
else
{
return await TenantStore.FindAsync(tenantIdOrName);
}
}

其中,TenantStore就来源我们系统开始配置的AbpDefaultTenantStoreOptions类

ABP-VNext 用户权限管理系统实战06---多租户集成的更多相关文章

  1. SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  2. SpringSecurity权限管理系统实战—一、项目简介和开发环境准备

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  3. SpringSecurity权限管理系统实战—二、日志、接口文档等实现

    系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...

  4. SpringSecurity权限管理系统实战—四、整合SpringSecurity(上)

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  5. SpringSecurity权限管理系统实战—六、SpringSecurity整合jwt

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  6. SpringSecurity权限管理系统实战—七、处理一些问题

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  7. SpringSecurity权限管理系统实战—九、数据权限的配置

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  8. Vue Abp vNext用户登录(Cookie)

    因为Abp vNext没找到Vue的模板,网上也没找到相关vNext的例子,只能自己试着写写,asp.net core abp vue都是刚学不久,所以很粗糙也可能有错误的地方,如果您看到请指正,谢谢 ...

  9. SpringSecurity权限管理系统实战—五、整合SpringSecurity(下)

    系列目录 前言 上篇文章SpringSecurity整合了一半,这次把另一半整完,所以本篇的序号接着上一篇. 七.自定义用户信息 前面我们登录都是用的指定的用户名和密码或者是springsecurit ...

  10. [Abp vNext 源码分析] - 14. EntityFramework Core 的集成

    一.简要介绍 在以前的文章里面,我们介绍了 ABP vNext 在 DDD 模块定义了仓储的接口定义和基本实现.本章将会介绍,ABP vNext 是如何将 EntityFramework Core 框 ...

随机推荐

  1. Python 绘制 K 线图

    import mplfinance as mpf import pandas as pd # 示例数据 data = pd.DataFrame({ 'Date': ['2023-01-01', '20 ...

  2. 解密华为问界M7 Pro:智能出行的全新里程碑与技术亮点

    解读华为问界M7 Pro的智能里程碑 引言 2024年8月,智能出行领域迎来了一个激动人心的时刻--问界M7 Pro的重磅发布.这款智能SUV,不仅是华为在汽车领域的又一次大胆尝试,更是鸿蒙智行系统的 ...

  3. HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容

    背景 随着消费电子产品和移动互联网的普及,未成年人互联网普及率96.8%,超过80%的未成年人都拥有自己的上网设备,而如何引导孩子正确上网一直是家长们的担忧.市场上很多电子设备.系统推出了一些未成年人 ...

  4. Kubernetes-4:kubectl常用命令总结

    kubectl常用命令 1.kubectl get 显示资源 ## 查看pod列表,若pod后不指定名称空间(namespace),则默认为default名称空间 kubectl get pod ## ...

  5. html 跳转到新的网址

    更新window.location.href后面的值即可 文件名为 index.html <!DOCTYPE html> <html> <head> <met ...

  6. 光影精灵10 Win1+Ubuntu18.04 双系统 踩坑记录

    前言 第二年准备报名智能车了,当然还是创意组别.刚好买了今年新出的电脑光影精灵10,我想着也给它安一个双系统.但是没想到,相比于之前那个老电脑,新电脑的新硬件和驱动问题远比老电脑麻烦的多. 在经历了一 ...

  7. .NET Core搭配Vue开源弹幕效果,实现一个评论小项目。好玩!

    ZY树洞 前言 ZY树洞是一个基于.NET Core开发的简单的评论系统,主要用于大家分享自己心中的感悟.经验.心得.想法等. 好了,不卖关子了,这个项目其实是上班无聊的时候写的,为什么要写这个项目呢 ...

  8. AGC007F 题解

    题意 给定两个长为 \(n\) 的字符串 \(S, T\),求最少进行多少次操作才能使 \(S = T\). 一次操作定义为:对于 \(i = 1, 2, .. n\),令第 \(i\) 位为操作后的 ...

  9. ASP.NET Core – System.Text.Json

    前言 System.Text.Json 是 .NET 3.0 后推出的, 用来取代原本的 Newtonsoft. 它的特点就是快,一开始的时候很多东西不支持所以很少人用,.NET 6.0 后开始比较稳 ...

  10. JavaScript —— 简介-引入方式

    什么是JavaScript?    JavaScript的引入方式: