我有一个使用Pyramid/SQLAlchemy/Postgresql构建的Web应用程序,允许用户管理一些数据,并且该数据几乎完全独立于不同的用户.说,Alice访问alice.domain.com
并且能够上传图片和文档,并且Bob访问bob.domain.com
并且还能够上传图片和文档.Alice永远不会看到Bob创建的任何内容,反之亦然(这是一个简化的例子,真的可能在多个表中有很多数据,但想法是一样的).
现在,在DB后端组织数据最直接的选择是使用单个数据库,其中每个表(pictures
和documents
)都有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的图片和文档设置单独的表(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)为每个用户使用单独的数据库:
- database_alice
- pictures
- documents
- database_bob
- pictures
- documents
Run Code Online (Sandbox Code Playgroud)
这似乎是最干净的解决方案,但我不确定多个数据库连接是否需要更多的RAM和其他资源,限制了可能的"租户"数量.
所以,问题是,这一切都有意义吗?如果是,我如何配置SQLAlchemy以在每个HTTP请求上动态修改表名(对于选项1)或者维护到不同数据库的连接池并为每个请求使用正确的连接(对于选项2)?
我正在开发一篇关于这篇文章的多租户应用程序.问题是我第一次运行所有迁移.在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
我们面临的以下问题需要帮助
任何提示将不胜感激!
到目前为止一切顺利,一切都按预期工作,使用 AWS Amplify 的 SDK,用于客户端的实施。Amplify 表现良好,让我可以随心所欲。服务器验证组归属等。
我想限制非管理员用户(不属于“管理员”组)通过 Amplify 执行某些 Cognito 操作。2 例子:
当我希望管理员能够为其他用户设置 MFA(启用/禁用)时,实际问题就开始了,但在 Cognito(据我所知)中,只有用户可以设置他自己的 MFA 设置。
我是否可以限制某个组中的用户对自己执行操作,例如禁用 MFA(即使用户池的 MFA 设置为“可选”)?
非常感谢大家!任何帮助,将不胜感激!
我试图了解如何在大规模多租户场景中使用 Keycloak。
标准方法似乎是为每个租户使用一个领域。这隔离了每个租户的用户和设置,很有意义。
在多租户的Keycloak 示例中,它说它“展示了Keycloak 多租户支持的最简单可能的场景”(强调我的)。我可能对此读得太多了,但对我来说这意味着还有其他标准方法。尽管如此,我还没有找到关于这些选项的太多讨论。
我还读到,超过 100 个领域存在潜在的性能问题。可能是这些性能问题已得到修复,但这也向我表明 Keycloak 不会处理具有 1,000 多个租户的大规模多租户场景。
所以我的问题是:
我想设置一个多租户ASP.NET MVC应用程序.理想情况下,这个应用程序将有一个路由{tenant}/{controller}/{action}/{id}
,每个路由tenant
代表一个应用程序的逻辑实例(只是独立的多用户帐户)
细粒度的细节对我来说还是很不清楚.任何可用于使用ASP.NET MVC设置此多租户方案的指南?
我已经看了一会儿玩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)
我不知道每个数据库是如何存储的,因此问题是:这适用于拥有大量租户的大型应用程序吗?
我正在构建一个SAAS应用程序,我们正在讨论每个客户端与共享数据库之间的一个数据库.我已经阅读了很多内容,其中包含了一些主题,但我还是有很多疑问.
我们的平台应该由每个客户高度定制.(他们应该能够拥有自定义表并向现有表添加自定义字段).在这种情况下,多数据库方法看起来很棒.
问题是.我的"用户"表应该在主数据库中还是在每个客户端数据库中?用户可能拥有一个或多个组织,因此它将存在于多个数据库中.那么,像国家表等通用表怎么样?
在master数据库中是有意义的.但是我有许多带有created_by字段的表,它们具有用户的外键.客户端也有一些权限相关的表.
如果有多个数据库,我会失去外键的强大功能,这意味着对数据库的查询更多.我知道我可以在数据库之间使用交叉连接,如果它们在同一台服务器中,那么我就会失去可扩展性.(我将来可能需要有多个数据库服务器).我已经考虑了联邦表.不确定性能.
我使用的技术是php和symfony 2框架以及数据库的mysql.
另外,我担心维护这样一个系统.我们可以创建一些脚本来自动化所有数据库中的模式更改,但是如果我们有10k客户端就意味着10k数据库.
你对此有何看法?我的应用程序的主要特点应该是灵活性,所以如果客户需要比基本平台没有的更具体的东西,应该可以为他做.
database architecture database-design multiple-databases multi-tenant
在为Laravel 5构建多租户包时,我必须找到如何从代码中动态添加中间件.与SO上的这个问题相比,我不想触及Http/Kernel定义.
在应用程序初始化期间,我检查数据库中是否已知所请求的主机名,以及该主机名是否需要重定向到主主机名或ssl.
因为您不想触摸Http/Kernel
包,所以我们需要使用服务提供商.
要求:
到目前为止,我已经看到大量的墨水泄露了Docker如何不被隔离以允许任意容器在多租户环境中运行,这是有道理的."如果它是Docker中的root用户,请将其视为主机中的root用户." 那么非root呢?
如果我想获取一些不受信任的代码并在容器中运行它,只要容器作为非root非sudo用户运行,它是否可以安全地完成?做这样的事情有哪些潜在的安全隐患?
我很确定今天有生产应用程序这样做(CI系统,可运行的pastebins),但他们是否幸运没有一个坚定的攻击者或者这在生产系统中是否合理?
首先,我很了解Keycloak中的多领域多租户方法。我已经接管了一个遗留项目,没有人想到多租户。现在,两年后,突然,客户需要此功能。实际上,微服务是开箱即用的。
客户开发了一个移动应用,该应用通过我们的密钥斗篷实例上的API使用帐号(作为用户名)和密码对用户进行身份验证。现在,他想在登录信息中添加一个租户ID。
客户希望避免使用多个端点,这是多领域解决方案所需要的。
第一个想法是在注册时将租户ID和帐户ID串联起来。但这是一种臭气冲冲的方法。
因此,我认为可能存在一种配置Keycloak的方式,即我添加了一个自定义tenantid
字段,username
其行为就像数据库世界中的复合主键一样。
这样的配置可行吗?是否有另一种方法可以使用单个领域实现多租户行为?
multi-tenant ×10
keycloak ×2
amazon-iam ×1
architecture ×1
asp.net-mvc ×1
database ×1
docker ×1
laravel ×1
laravel-5 ×1
postgresql ×1
python ×1
ravendb ×1
security ×1
sqlalchemy ×1