【问题标题】:Django Models and Permission RestrictionsDjango 模型和权限限制
【发布时间】:2017-03-04 05:01:46
【问题描述】:

型号:

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 方法的引用……但我也不确定这是否是我所需要的。

【问题讨论】:

  • 权限一般与(登录)用户有关。每个用户都属于一家公司吗?
  • 是的,每个用户都属于一个公司。

标签: python django python-3.x


【解决方案1】:

我可以建议你的最好的包是DJANGO GUARDIAN。但是你真正在寻找什么Role Based Access Control Logic

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

【讨论】:

  • 谢谢你,你知道我可以剖析使用 Guardian 的任何例子吗?
  • DOCS 总是最好的来源。但既然你问了,请检查这个SO 问题。
【解决方案2】:
class Company(models.Model)
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children')


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

其余的逻辑我可以通过Views控制

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      有几种管理访问权限的通用方法,包括所有权/角色和对象特定权限。

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

      相反,听起来您需要一个分层解决方案来管理对不一定与特定公司有主要关系的对象(公司或产品)的访问。也就是说,最高级别的管理员可以选择将产品与一个或多个子公司相关联,而移除关联将递归地移除该对象的关联,使其更向下。

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

      我要强调的是,这听起来像部分,因为目前尚不完全清楚这是否正是您要解决的问题以及是否就是您需要解决的全部问题。

      【讨论】:

      • 另外,您是否建议将django-mpttdjango-organizations 结合使用?
      猜你喜欢
      • 2019-09-15
      • 2021-02-22
      • 1970-01-01
      • 2015-07-21
      • 2018-03-04
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多