标签: multi-tenant

SQLAlchemy的多租户

我有一个使用Pyramid/SQLAlchemy/Postgresql构建的Web应用程序,允许用户管理一些数据,并且该数据几乎完全独立于不同的用户.说,Alice访问alice.domain.com并且能够上传图片和文档,并且Bob访问bob.domain.com并且还能够上传图片和文档.Alice永远不会看到Bob创建的任何内容,反之亦然(这是一个简化的例子,真的可能在多个表中有很多数据,但想法是一样的).

现在,在DB后端组织数据最直接的选择是使用单个数据库,其中每个表(picturesdocuments)都有user_id字段,所以,基本上,要获取所有Alice的图片,我可以做类似的事情

user_id = _figure_out_user_id_from_domain_name(request)
pictures = session.query(Picture).filter(Picture.user_id==user_id).all()
Run Code Online (Sandbox Code Playgroud)

这一切都很简单,但也存在一些缺点

  • 我需要记住在进行查询时总是使用额外的过滤条件,否则Alice可能会看到Bob的图片;
  • 如果有很多用户,表可能会变得庞大
  • 在多台机器之间拆分Web应用程序可能很棘手

所以我认为以某种方式分割每个用户的数据真的很好.我可以想到两种方法:

  1. 在同一个数据库中为Alice和Bob的图片和文档设置单独的(Postgres的Schemas似乎是在这种情况下使用的正确方法):

    documents_alice
    documents_bob
    pictures_alice
    pictures_bob
    
    Run Code Online (Sandbox Code Playgroud)

    然后,使用一些黑魔法,根据当前请求的域"将"所有查询"路由"到一个或另一个表:

    _use_dark_magic_to_configure_sqlalchemy('alice.domain.com')
    pictures = session.query(Picture).all()  # selects all Alice's pictures from "pictures_alice" table
    ...
    _use_dark_magic_to_configure_sqlalchemy('bob.domain.com')
    pictures = session.query(Picture).all()  # selects all Bob's pictures from "pictures_bob" table
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为每个用户使用单独的数据库:

    - database_alice
       - pictures
       - documents
    - database_bob
       - pictures
       - documents 
    
    Run Code Online (Sandbox Code Playgroud)

    这似乎是最干净的解决方案,但我不确定多个数据库连接是否需要更多的RAM和其他资源,限制了可能的"租户"数量.

所以,问题是,这一切都有意义吗?如果是,我如何配置SQLAlchemy以在每个HTTP请求上动态修改表名(对于选项1)或者维护到不同数据库的连接池并为每个请求使用正确的连接(对于选项2)?

python postgresql sqlalchemy multi-tenant

10
推荐指数
2
解决办法
4330
查看次数

在Rails中使用Postgres多模式数据库

我正在开发一篇关于这篇文章的多租户应用程序.问题是我第一次运行所有迁移.在schema.rb文件中只有公共模式的表,但其他模式发生了什么?如何创建具有不同结构的其他模式,public我不想使用宝石.

请参阅下面的示例

要为公共模式创建的表

class CreatePerspectives < ActiveRecord::Migration
  include MultiSchema
  def up
      with_in_schemas :only => :public do
         # Create table perspectives
      end
  end


  def down
    with_in_schemas :only => :public do
      drop_table :prespectives
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

要为私有模式创建的表

class CreateObjectives < ActiveRecord::Migration

  include MultiSchema

  def change
    with_in_schemas :except => :public do
        # Create objectives table
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

schema.rb

ActiveRecord::Schema.define(version: 20130810172443) do

  create_table "perspectives", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end
Run Code Online (Sandbox Code Playgroud)

multi-tenant rails-migrations rails-postgresql ruby-on-rails-4

10
推荐指数
1
解决办法
1776
查看次数

如何限制 AWS Cognito 用户执行某些操作?

我们面临的以下问题需要帮助

任何提示将不胜感激!

细节和环境:

  1. 一个多租户应用程序,旨在为每个客户(组织)提供一个专用租户,以实现完全分离。
  2. AWS Cognito 用户池作为我用户的数据存储和身份验证提供商。
  3. 每个客户(组织)的“AWS Cognito用户池”
  4. 角色管理——基于内置的用户池组。按角色分组,服务器端验证用户的访问令牌是否在其嵌入的组列表中包含组名。

到目前为止一切顺利,一切都按预期工作,使用 AWS Amplify 的 SDK,用于客户端的实施。Amplify 表现良好,让我可以随心所欲。服务器验证组归属等。

问题:

我想限制非管理员用户(不属于“管理员”组)通过 Amplify 执行某些 Cognito 操作。2 例子:

  1. 我想通过 Amplify 禁用非管理员用户修改特定属性值的能力。
  2. 我想禁用非管理员用户通过 Amplify 为自己修改 MFA 设置的能力。

当我希望管理员能够为其他用户设置 MFA(启用/禁用)时,实际问题就开始了,但在 Cognito(据我所知)中,只有用户可以设置他自己的 MFA 设置。

我看到并已经尝试过的:

  1. 设置用户属性的读/写权限。因此,我想要保护的特定属性只能通过具有开发人员凭据的 API 调用进行修改。这样,管理员可以调用我的服务器要求修改属性。服务器根据访问令牌通过所属组验证角色并调用 Cognito API。该解决方案的问题在于它仅涵盖属性修改场景。
  2. 为每个用户池创建一个 AWS Cognito 身份池。对于每个用户池中的每个组,创建一个 AWS IAM 角色,其策略将限制或允许所需的行为。实际上可以工作。该解决方案的问题在于,它感觉像是一个超级骗子的矫枉过正,而且它需要我为每个用户池创建一个额外的身份池和一个 IAM 角色。这意味着加入该服务的每个新客户都需要 (1) 用户池、(2) Cognito 客户端应用程序、(3) 身份池和 (4) IAM 角色(而不仅仅是用户池和 Cognito 客户端应用程序)。本质上,实施此解决方案。

真正的问题:

我是否可以限制某个组中的用户对自己执行操作,例如禁用 MFA(即使用户池的 MFA 设置为“可选”)?

非常感谢大家!任何帮助,将不胜感激!

multi-tenant amazon-web-services amazon-iam amazon-cognito

10
推荐指数
1
解决办法
2625
查看次数

使用 Keycloak 的大规模多租户场景

我试图了解如何在大规模多租户场景中使用 Keycloak。

标准方法似乎是为每个租户使用一个领域。这隔离了每个租户的用户和设置,很有意义。

多租户Keycloak 示例中,它说它“展示了Keycloak 多租户支持的最简单可能的场景”(强调我的)。我可能对此读得太多了,但对我来说这意味着还有其他标准方法。尽管如此,我还没有找到关于这些选项的太多讨论。

我还读到,超过 100 个领域存在潜在的性能问题。可能是这些性能问题已得到修复,但这也向我表明 Keycloak 不会处理具有 1,000 多个租户的大规模多租户场景。

所以我的问题是:

  • 除了“每个租户一个领域”之外,还有其他推荐的多租户方法吗?
  • 是否有任何大规模的 Keycloak 多租户部署证明其能够应对许多领域?
  • 是否有关于我应该查看的信息来源的建议?

multi-tenant keycloak

10
推荐指数
1
解决办法
1458
查看次数

使用ASP.NET MVC设置路由{tenant}/{controller}/{action}/{id}?

我想设置一个多租户ASP.NET MVC应用程序.理想情况下,这个应用程序将有一个路由{tenant}/{controller}/{action}/{id},每个路由tenant代表一个应用程序的逻辑实例(只是独立的多用户帐户)

细粒度的细节对我来说还是很不清楚.任何可用于使用ASP.NET MVC设置此多租户方案的指南?

asp.net-mvc asp.net-mvc-routing multi-tenant

9
推荐指数
1
解决办法
7091
查看次数

RavenDb和MultiTenancy

我已经看了一会儿玩RavenDb并开始关注MultiTenancy.Ayendes的多租户样本如下:

using(var store = new DocumentStore
{
    Url = "http://localhost:8080"
}.Initialize())
{
    store.DatabaseCommands.EnsureDatabaseExists("Brisbane");

    store.DatabaseCommands.EnsureDatabaseExists("Melbroune");
    store.DatabaseCommands.EnsureDatabaseExists("Sidney");

    using (var documentSession = store.OpenSession("Brisbane"))
    {
        documentSession.Store(new { Name = "Ayende"});
        documentSession.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道每个数据库是如何存储的,因此问题是:这适用于拥有大量租户的大型应用程序吗?

multi-tenant ravendb

9
推荐指数
1
解决办法
1549
查看次数

多租户数据库架构

我正在构建一个SAAS应用程序,我们正在讨论每个客户端与共享数据库之间的一个数据库.我已经阅读了很多内容,其中包含了一些主题,但我还是有很多疑问.

我们的平台应该由每个客户高度定制.(他们应该能够拥有自定义表并向现有表添加自定义字段).在这种情况下,多数据库方法看起来很棒.

问题是.我的"用户"表应该在主数据库中还是在每个客户端数据库中?用户可能拥有一个或多个组织,因此它将存在于多个数据库中.那么,像国家表等通用表怎么样?

在master数据库中是有意义的.但是我有许多带有created_by字段的表,它们具有用户的外键.客户端也有一些权限相关的表.

如果有多个数据库,我会失去外键的强大功能,这意味着对数据库的查询更多.我知道我可以在数据库之间使用交叉连接,如果它们在同一台服务器中,那么我就会失去可扩展性.(我将来可能需要有多个数据库服务器).我已经考虑了联邦表.不确定性能.

我使用的技术是php和symfony 2框架以及数据库的mysql.

另外,我担心维护这样一个系统.我们可以创建一些脚本来自动化所有数据库中的模式更改,但是如果我们有10k客户端就意味着10k数据库.

你对此有何看法?我的应用程序的主要特点应该是灵活性,所以如果客户需要比基本平台没有的更具体的东西,应该可以为他做.

database architecture database-design multiple-databases multi-tenant

9
推荐指数
1
解决办法
6194
查看次数

laravel 5的动态中间件

为Laravel 5构建多租户包时,我必须找到如何从代码中动态添加中间件.与SO上的这个问题相比,我不想触及Http/Kernel定义.

在应用程序初始化期间,我检查数据库中是否已知所请求的主机名,以及该主机名是否需要重定向到主主机名或ssl.

因为您不想触摸Http/Kernel包,所以我们需要使用服务提供商.

要求:

  • 动态添加中间件而不触及Http/Kernel
  • 使用服务提供者和响应对象而不是"黑客"

multi-tenant laravel laravel-routing laravel-5

9
推荐指数
1
解决办法
3786
查看次数

作为非root用户在Docker容器中运行不受信任的代码有哪些潜在的安全问题?

到目前为止,我已经看到大量的墨水泄露了Docker如何不被隔离以允许任意容器在多租户环境中运行,这是有道理的."如果它是Docker中的root用户,请将其视为主机中的root用户." 那么非root呢?

如果我想获取一些不受信任的代码并在容器中运行它,只要容器作为非root非sudo用户运行,它是否可以安全地完成?做这样的事情有哪些潜在的安全隐患?

我很确定今天有生产应用程序这样做(CI系统,可运行的pastebins),但他们是否幸运没有一个坚定的攻击者或者这在生产系统中是否合理?

security multi-tenant docker

9
推荐指数
1
解决办法
539
查看次数

是否可以在一个领域内完成Keycloak中的多租户?

首先,我很了解Keycloak中的多领域多租户方法。我已经接管了一个遗留项目,没有人想到多租户。现在,两年后,突然,客户需要此功能。实际上,微服务是开箱即用的。

客户开发了一个移动应用,该应用通过我们的密钥斗篷实例上的API使用帐号(作为用户名)和密码对用户进行身份验证。现在,他想在登录信息中添加一个租户ID。

客户希望避免使用多个端点,这是多领域解决方案所需要的。

第一个想法是在注册时将租户ID和帐户ID串联起来。但这是一种臭气冲冲的方法。

因此,我认为可能存在一种配置Keycloak的方式,即我添加了一个自定义tenantid字段,username其行为就像数据库世界中的复合主键一样。

这样的配置可行吗?是否有另一种方法可以使用单个领域实现多租户行为?

multi-tenant keycloak

9
推荐指数
1
解决办法
657
查看次数