- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够根据用户在运行时所属的租户来选择特定的 Spring(或 Grails)上下文配置。假设我使用 Spring Security 并在登录期间检索tenantId。
想象一下,现在我有两个租户,他们支付不同的佣金。如何在没有太多管道的情况下将特定服务注入(inject) Controller ?这里有两个不同的上下文。所以,我应该根据租户注入(inject)不同的 ExchangeService。
@Configuration
public class FooTenant{
@Bean
public ExchangeService bar() {
return new ZeroCommisionExchangeService ();
}
}
@Configuration
public class BarTenant{
@Bean
public ExchangeService bar() {
return new StandardCommisionExchangeService ();
}
}
最佳答案
虽然可以在运行时交换在 spring 上下文中实例化的 bean (HotswappableTargetSource
),但它并不适用于您的用例。
请记住,您的应用程序有一个 Spring 上下文,所有线程都使用相同的实例(在大多数情况下),这意味着当您交换 bean 实现时,您正在为您的所有应用程序用户有效地执行此操作。为防止这种情况,您会遇到确保线程安全的问题,使用线程局部变量,如另一个答案中所列。
虽然可以继续这种方法并实现完成工作的实现,但这绝对是解决这个问题的一种非常人为的方法。
您应该退后一步,以更健康、系统范围的设计观点来看待您的问题。翻开你的模式书籍,看看如何解决这个问题,不管你是使用 Spring 还是其他框架。上面一些答案中描述的服务定位器、工厂 bean 等是朝着正确方向迈出的一步。
您的用例对于 Multi-Tenancy 应用程序非常常见。您需要根据tenantId 缩小可能会发生变化的事物与不断变化的事物的范围。
例如问题中提到的,每个租户可能有不同的佣金金额,甚至不同的佣金计算算法。一个简单的解决方案是实现 CommissionCalculationService
接受 tenantId
,以及任何其他要计算佣金的域对象,我想这将类似于 Order
或 Sale
,在您的应用程序中任何有意义的东西。
您现在需要一个 CommissionServiceFactory
或 ServiceLocator
其中将包含 CommissionCalculationService
的租户特定实现. Service Locator
在 Spring 上下文加载时实例化,并在应用程序启动时注入(inject)实现类。
当你想为租户计算佣金时,你基本上得到tenantId
根据 tenantId
,从用户的登录中,将租户 ID 传递给您的服务定位器通过,服务定位器返回服务实现的适当实例。在您的调用类中,使用此实例计算租户的佣金。
另一个要考虑的模式是 Strategy Pattern
, 甚至 Template Pattern
.
最重要的是,即使您希望干净地实现特定于租户的逻辑,也不要更改上下文中加载的 bean。在您的上下文中拥有可以处理所有租户特定逻辑的类。依靠设计模式从基于租户 id 的上下文中使用正确的 bean。
如果答案有点冗长,我深表歉意,我觉得有必要解释为什么我认为在加载的 Spring Context 中更新 bean 不是合适的解决方案。
关于spring - 如何根据租户在运行时选择spring配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20207851/
2 个不同的租户(租户 A 中的订阅 A 和租户 B 中的订阅 B) 我们在 Azure 云中有一个订阅,并且我们已经设置了 Azure Keyvault。我们可以在那里创建 key 并使用其中一个
如何在代码中配置 Windows Azure Active Directory 租户? 我希望能够允许用户访问我的 Multi-Tenancy SaaS 应用程序、注册我的服务并为其配置 Azure
我阅读了有关 headless 应用程序如何通过 Azure 进行身份验证的各种文章。我对术语有点困惑。在此sample code ,它说它需要一个 Azure AD 租户帐户。 我的理解是Azure
背景:我正在使用 Django 开发我的第一个 Multi-Tenancy 应用程序。我已经成功按照 https://github.com/tomturner/django-tenants 给出的教程
我正在尝试让 Microsoft 验证我的应用。第一步是成为微软合作伙伴,但我不知道如何登录? 当我尝试创建 Azure AD 租户时,我被告知我没有权限(即使我拥有该帐户)。 我无法使用用于登录 A
我开始学习 Microsoft Azure,但我陷入困境谁能详细告诉我 Microsoft 帐户、租户和订阅之间有什么区别? 最佳答案 当您说“Microsoft 帐户”时,这通常指个人 Micros
摘要:如何动态获取Microsoft用户的Tenant ID? 详细信息:我正在编写一个 Multi-Tenancy 应用程序(C# 和 .NET Core),我想使用它来创建订阅和 register
我正在尝试在澳大利亚区域创建 Azure B2C 租户,但在区域下拉列表中找不到澳大利亚。文档显示 Azure B2C 租户在所有位置都可用。我错过了什么吗? 最佳答案 基于Data residenc
我正在尝试在澳大利亚区域创建 Azure B2C 租户,但在区域下拉列表中找不到澳大利亚。文档显示 Azure B2C 租户在所有位置都可用。我错过了什么吗? 最佳答案 基于Data residenc
我正在尝试 ad-b2c,天哪,即使第一步结果也非常令人沮丧。无论如何,这是我的问题: 我的现有订阅有一个默认目录,该目录有自己的 mydefaultdirectory.onmicrosoft.com
我正在开发一个 ASP.NET MVC 应用程序,它必须访问 Office365 API。我使用了描述here为了获得仅应用程序的访问 token 。 现在,运行应用程序后,我进入 AAD 同意流程以
假设我购买了位于 Azure AD 租户 1(与资源林同义)中的 Multi-Tenancy 应用程序(HR 软件)。 我还购买了 Azure 租户 2 中另一家公司拥有的健康应用程序。 我不拥有租户
这是我的场景:新用户使用 Azure B2C 工作流程注册我们的 Web 应用程序。用户可以使用不同的身份提供商(Google、Microsoft、Amazon)进行注册。用户需要访问数据库。我想将他
我正在尝试删除我的 Azure AD 租户,但它显示: Directory has one or more applications. 我按照此处的步骤操作 https://support.micro
我有两个 B2C 租户。一种用于生产环境,另一种用于临时环境。我想将所有用户从生产租户迁移到暂存租户。我想定期这样做,用真实数据对临时环境进行测试。我知道我可以读取一个租户的所有用户并将其写入另一个租
Microsoft 的 UI 显示所有初始检查均已通过,他们可以删除此 Azure Active Directory 租户。随后出现消息称 Microsoft 实际上无法删除租户。我还能做些什么来真正
我正在尝试删除我的 Azure AD 租户,但它显示: Directory has one or more applications. 我按照此处的步骤操作 https://support.micro
我有两个 B2C 租户。一种用于生产环境,另一种用于临时环境。我想将所有用户从生产租户迁移到暂存租户。我想定期这样做,用真实数据对临时环境进行测试。我知道我可以读取一个租户的所有用户并将其写入另一个租
Microsoft 的 UI 显示所有初始检查均已通过,他们可以删除此 Azure Active Directory 租户。随后出现消息称 Microsoft 实际上无法删除租户。我还能做些什么来真正
有没有办法阻止用户登录到他们自己的 AAD 租户?例如,允许登录 contoso.onmicrosoft.com 但不允许登录 fabrikam.onmicrosoft.com。 我的客户有一个高度受
我是一名优秀的程序员,十分优秀!