如何在Django中实施基于帐户的分离

如何在Django中实施基于帐户的分离,django,django-queryset,django-authentication,Django,Django Queryset,Django Authentication,我有一个Django应用程序,它有一个单一的帐户模型。我们正在将其转换为多帐户,因此几乎每个型号都将有一个外汇钥匙(帐户) 确保每个帐户(每个帐户位于其自己的子域中)只能访问其自己的数据的最简单方法是什么?我们有一个中间件,用于填充子域和每个请求的当前帐户 我们可以通过在所有视图中添加一个过滤器(..,account=request.account)来实现这一点。这是不可取的,因为 filter(..,account=request.account)将添加到所有的查询中,使其不枯燥、重复且容易出

我有一个Django应用程序,它有一个单一的帐户模型。我们正在将其转换为多帐户,因此几乎每个型号都将有一个
外汇钥匙(帐户)

确保每个
帐户(每个帐户位于其自己的子域中)只能访问其自己的数据的最简单方法是什么?我们有一个中间件,用于填充子域和每个请求的当前帐户

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

  • filter(..,account=request.account)
    将添加到所有的查询中,使其不枯燥、重复且容易出错
  • 更大的风险是,如果缺少一个过滤器,任何地方都存在安全风险

  • 这段代码可能会让您找到正确的方向。我相信行级权限也在1.2的todo列表中,但不是100%确定。

    是否有很大的原因让您不能只编写一个函数,自动将会话帐户插入查询并将所有其他参数作为参数?

    是否使用
    django.contrib.auth

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

    例如,
    ForeignKey(用户)

    另外,看看

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

    而不是做

    my_model.objects.filter(user=request.user)
    
    只要做:

    request.user.my_model_set.all()
    

    我不认为有明确的赢家,尤其是如果你认为不是所有的查询都需要通过账户过滤。还考虑到旧的代码> TraceLoopes/Copy:Tog被认为是不可靠的,这意味着唯一能够自动插入滤波器参数的方法是用中间件…但在我看来,这也不可靠,也很复杂

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

    所以,我认为“多租户”数据库的最佳解决方案就是确保所有查询都按帐户过滤。您可以通过以下方式执行此操作:

    • 调试模式中间件,例如

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

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


    当然不漂亮,但这是我迄今为止所能做到的最好的。哇,我也有同样的问题。以下是我得到的最佳答案:


    是的,但这仍然意味着,我需要在每个地方放置一个显式的
    过滤器
    。但是您可以从用户对象开始:
    user.object1\u set.all()
    而不是
    object1.objects.filter(user=user)
    如何在模型或管理器中获取
    request.session
    ,而不在每个查询中显式传递它。如果我这样做,我可能会在每次通话中过滤。