【问题标题】:How to enforce account based separation in Django如何在 Django 中强制执行基于帐户的分离
【发布时间】:2009-12-03 12:44:24
【问题描述】:

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

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

我们可以通过在所有视图中添加filter(...., account = request.account) 来实现这一点。这是不可取的,因为,

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

【问题讨论】:

    标签: django django-queryset django-authentication


    【解决方案1】:

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

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

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

    • 调试模式中间件如Middleware: Record ownership screener

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

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

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

    【讨论】:

      【解决方案2】:

      哇,我也遇到了同样的问题。这是我得到的最佳答案:

      Django: How would one organize this big model / manager / design mess?

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 如何在模型或管理器中获得request.session 而无需在每个查询中显式传递它。如果我要那样做,我可能会在每次通话时只使用filter
          【解决方案5】:

          你在用django.contrib.auth吗?

          如果你是,只需将帐户设为ForeignKey(User, unique=true) 并将所有模型指向用户

          即。 ForeignKey(User)

          另外,看看django Auth Docs

          编辑:我想我现在更能理解您的担忧了...

          而不是做

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

          只是做:

          request.user.my_model_set.all()
          

          【讨论】:

          • 是的,但这仍然意味着,我需要在任何地方放置一个明确的filter
          • 但是你可以从用户对象开始:user.object1_set.all() 而不是object1.objects.filter(user=user)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-14
          • 1970-01-01
          • 2012-06-24
          • 1970-01-01
          • 1970-01-01
          • 2020-05-24
          • 2019-01-09
          相关资源
          最近更新 更多