【问题标题】:How to secure Rails app with several companies sharing application and databases [closed]如何与几家共享应用程序和数据库的公司保护 Rails 应用程序 [关闭]
【发布时间】:2014-06-02 11:29:04
【问题描述】:

环境:Ruby 2.0.0、Rails 4.1、Windows 8.1、Devise、CanCan、Rolify 都在 PostgreSQL 上。

我正在构建一个应用程序,该应用程序将有多家公司共享。每家公司都会有设计管理员来管理他们的用户。而且,每家公司都会使用自己的数据。所有这些都计划共享表,在这些表中由公司 ID 隔离。该应用程序目前正在使用用户管理,没有问题。每个管理员只看到与他们公司的用户交互。我即将为主应用程序构建 MVC。

我想在这一点上进行现实检查。一家公司对另一家公司的暴露程度如何?将存在哪些风险以及如何减轻它们?是否有另一个宝石可以帮助我实现这一点?或者,这只是一个非常非常糟糕的想法,我应该按照自己的形象孤立每家公司吗?

【问题讨论】:

  • 建议阅读“rails multi-tenant”——这方面已有很多信息。
  • 这真的很有帮助。我找不到搜索词。谢谢!
  • 寻找名为“公寓”的宝石。
  • 公寓看起来很有趣,令人兴奋!仍然要做推荐的功课。非常感谢!
  • 我了解所讨论的问题很广泛。这就是为什么我在最后问了几个具体问题,以集中回答。而且,我小心地省略了任何“最好的/方式”。因此,我收到了有关如何解决这种情况的具体反馈。恕我直言,这个重点解决了对广度的担忧。

标签: ruby-on-rails ruby postgresql devise multi-tenant


【解决方案1】:

正确地隔离客户比看起来更难。这不仅仅是一次性事件,您必须牢记它并随着您的成长继续处理它。数据隔离只是问题的一部分。您的所有资源、服务器、数据库、缓存、后台工作人员等...都由您的客户争用,一位客户的操作可能会影响您的应用对其他人的性能。

一定要研究多租户技术,但我建议你最终决定将一个简单的解决方案封装在一个与应用程序的其余部分无缝的抽象中。比如:

for_customer(1) do
  # This should return only the models visible to customer 1
  # regardless of where they live or however they are partitioned.
  MyModel.all
end

对于网络案例,该代码可以通过环绕过滤器包装控制器操作。现在不要担心粗略地实现它,这就是为什么你有一个存在于一个地方的抽象和分区代码。随着情况发生变化并且您遇到问题和/或不足,请改进实施和部署。

我在一家拥有数百名客户的 SaaS 公司工作,他们都获得了真正的流量,我们无法预见我们最终会遇到的所有问题,以使客户彼此隔离。在无缝部署期间,乘客在启动时未正确清除跨进程分支的 memcached 连接之类的事情。或者,在 ActiveRecord 升级后,正确确保数据库连接不会在 resque 工作进程分支之间共享的代码突然变得不充分。

现在不要试图弄清楚所有事情,只要确保这段代码存在于一个地方,并且如果它发生变化,它不会对你的应用程序的其余部分产生级联效应。因为你知道它需要改变。

【讨论】:

  • 我实现了acts_as_tenant gem。哇。这是迄今为止我见过的最简单的实现,它就像一个魅力。
  • 太好了,很高兴它对你有用。
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2011-05-07
  • 2012-02-16
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多