Django中多个模型的原始查询和行级访问控制



我正在尝试为用户提供一个在数据库上编写自定义查询的接口。我需要确保他们只能查询允许的记录。为此,我决定使用Django-Guardian应用基于行的访问控制。

这是我的模式的样子

class BaseClass(models.Model):
    somefield = models.TextField()
    class Meta:
        permissions = (
            ('view_record', 'View record'),
        )
class ClassA(BaseClass):
    # some other fields here
    classb = models.ForeignKey(ClassB)
class ClassB(BaseClass):
    # some fields here
    classc = models.ForeignKey(ClassC)
class ClassC(BaseClass):
    # some fields here

我希望能够使用get_objects_for_group如下:

>>> group = Group.objects.create('some group')
>>> class_c = ClassC.objects.create('ClassC')
>>> class_b = ClassB.objects.create('ClassB', classc=class_c)
>>> class_a = ClassA.objects.create('ClassA', classb=class_b)
>>> assign_perm('view_record', group, class_c)
>>> assign_perm('view_record', group, class_b)
>>> assign_perm('view_record', group, class_a)
>>> get_objects_for_group(group, 'view_record')

这给了我一个QuerySet。我可以使用上面定义的基本镜子并在其他相关类上编写原始查询吗?

>>> qs.intersection(get_objects_for_group(group, 'view_record'), 
                    BaseClass.objects.raw('select * from table_a a'
                                          'join table_b b on a.id=b.table_a_id '
                                          'join table_c c on b.id=c.table_b_id '
                                          'where some conditions here'))

这种方法有意义吗?有更好的解决这个问题的方法吗?

谢谢!

编辑:

解决问题的另一种方法可能是为每个用户创建一个单独的表。我了解这可能会增加我的应用程序的复杂性,但是:

  • 长期以来,用户数量不会超过100。不是消费者应用程序。
  • 根据我们的用例,我不太可能需要在这些表中查询。我不会编写需要从table1,table2,table3中汇总任何内容的查询,该查询属于同一模型。
  • 每个客户维护单独的表可能会有优势。

您认为这是一种可行的方法吗?

研究了许多选项后,我发现我可以在PostgreSQL上使用行级别的安全性在数据库级别解决此问题。最终是最简单,最优雅的。

本文为我提供了很大的帮助,以使用PostgreSQL策略来弥合应用级别的用户。

我通过研究所学到的是:

  • 当客户可能会运行任意查询,因此将来仍然可以选择单独的表格。

  • 如果您打算使用原始或临时查询,则几乎不可能在ORM级别解决它。

我想您已经知道您需要做什么。您要寻找的单词是多种义务。尽管每个客户不是一个桌子。最适合您的西装是每个客户一个架构。不幸的是,我在多种方面拥有的最好的文章不再可用。查看是否可以找到缓存的版本:https://msdn.microsoft.com/en-us/library/aa479086.aspx,否则互联网上有许多文章。

另一种可行的方法是看一下定制经理。您可以为每个模型客户编写一个自定义经理,并相应地查询。但是所有这些都会导致应用程序的复杂性,并很快就会摆脱困境。应用程序安全层中的任何错误都是对您的噩梦。

称重两者,我倾向于说多种解决方案,就像您在编辑中所说的那样是迄今为止最好的方法。

首先,您应该为我们提供更多详细信息,与Django的建筑设置和构建方式,以便我们可以为您提供帮助。您实施了API吗?如果您要构建大规模应用程序,可以使用大量数据,则使用Django模板并不是一个好主意。因为这可能会严重影响查询负载。我建议从后端提取前端。

<</p>

相关内容

  • 没有找到相关文章

最新更新