Django模型和权限限制

时间:2017-03-04 05:01:46

标签: python django python-3.x

型号:

Company

Product

我们有一家母公司(所有人的所有者)可以创建任何Company和任何Product,作为子公司或子产品。

现在,我想要完成的是限制哪家公司可以CRUD其他公司和产品。

以下是场景:

公司及子公司(分包商):

Master (creates) -> Company “A”
Master (creates) -> Company “B” (creates) -> Company “C”
Master (creates) -> Company “D” (creates) -> Company “F” (creates) -> Company “G”

公司和产品分配:

Master (Add Product) -> Show all products
Master (assign products to top levels) -> Company “A”, Company “B” and Company ”D”

子公司产品分配(管理):

Company “B” (assign products only to sub-level) -> Company “C”
Company “D” (assign products only to sub-level) -> Company “F”
Company “F” (assign products only to sub-level) -> Company “G”

但是,如果Company D从子级别删除了某个产品,那么这也会以递归方式从所有子级别的产品中删除。

有没有确定的方法可以用Django核心做到这一点,或者可能有我推荐的库,我找不到?我还在Django文档中看到Model Meta optionsOptions.permissions方法的引用......但我不确定这是我需要的。

4 个答案:

答案 0 :(得分:5)

我建议你的最佳方案是DJANGO GUARDIAN。但你真正在寻找Role Based Access Control Logic

不幸的是,django-guardian不支持角色。 Linked issue。所以我建议你为此写自己的观点。但您可以查看以下这些包:

答案 1 :(得分:0)

使用基本视图检查用户所属的公司。每个(继承)视图将根据登录用户的公司限制功能。使用django-mptt处理树状结构数据。

答案 2 :(得分:0)

class Company(models.Model)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children')


Company.objects.get(pk=1).children.all()

我可以通过Views

控制的其余逻辑

答案 3 :(得分:0)

有一些管理访问权限的常规方法,包括所有权/角色和对象特定权限。

所有权是Django Organizations用作开箱即用权限管理策略的所有权。对象由组织拥有 - 只有一个 - 并且访问仅限于该组织的成员(角色)。您可以在基于Django Organizations的应用程序中对此进行扩展,但是您没有获得大部分好处。

相反,它听起来像您需要一个层级解决方案来管理对某个公司或产品的访问,这些对象不一定与某个特定公司有主要关系。也就是说,顶级管理员可以选择将产品与一个或多个子公司关联,并且删除关联将递归地移除该对象在树下的关联。

所以听起来你应该看看django-mpttdjango-treebeard来记录公司的树和产品关系,使用树作为视图访问的真实来源,并确保在从一家公司移除产品时删除所有子关系。

我强调这个听起来像是的一部分,因为如果这正是你想要解决的问题并且如果那样的话,它并不完全清楚。所有你需要解决的问题。