1

我有一个具有单帐户模型的 Django 应用程序。我们正在将其转换为多帐户,因此几乎每个模型都会有一个ForeignKey(Account).

确保每个Account(每个帐户都在自己的子域中)只能访问自己的数据的最简单方法是什么?我们有一个填充子域的中间件,以及每个请求的当前帐户。

filter(...., account = request.account)我们可以通过在我们所有的视图中添加一个艰难的方式来做到这一点。这是不可取的,因为,

  1. filter(...., account = request.account) 将被添加到所有查询中,从而使此操作不枯燥、重复且容易出错。
  2. 更大的风险是如果缺少过滤器,任何地方都有安全风险。
4

5 回答 5

2

我认为没有明显的赢家,特别是如果您认为并非所有查询都需要按帐户过滤。还要考虑旧threadlocals技巧被认为是不可靠的,这意味着自动插入过滤器参数的唯一方法是使用中间件我猜......但这对我来说似乎也不可靠和复杂。

我也没有想出一个很好的方法来制作一个可以在这里提供帮助的查询管理器,但它可能是可能的。

因此,我认为“多租户”数据库的最佳解决方案就是确保您的所有查询都按帐户过滤。你可以这样做:

  • 调试模式中间件,例如Middleware:Record Ownership Screener

  • 在您的测试中检查任何测试生成的 sql 并验证 account 字段是否在查询中。您还可以在测试夹具中包含“其他帐户”数据,您的测试将确保不会出现在任何查询结果中。

  • 确保在代码审查期间检查所有查询的过滤器

当然不漂亮,但到目前为止我能做到的最好的。

于 2009-12-03T16:34:02.810 回答
1

哇,我遇到了完全相同的问题。这是我得到的最佳答案:

Django:如何组织这个大模型/经理/设计混乱?

于 2010-01-25T22:12:24.790 回答
0

这个片段可能会让你朝着正确的方向前进。我相信行级权限也在 1.2 的待办事项列表中,但不是 100% 确定。

于 2009-12-03T13:52:17.740 回答
0

为什么你不能只编写一个自动将会话帐户插入查询并将所有其他参数作为参数的函数,是否有一些重要的原因?

于 2009-12-03T13:57:44.553 回答
0

你在用django.contrib.auth吗?

如果是,只需创建 Account aForeignKey(User, unique=true)并将所有模型指向 User

IE。ForeignKey(User)

另外,看看django Auth Docs

编辑:我想我现在更好地理解了你的担忧......

而不是做

my_model.objects.filter(user=request.user)

做就是了:

request.user.my_model_set.all()
于 2009-12-03T16:12:13.220 回答