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