【问题标题】:What is best practice for restricting user permissions when editing model instances编辑模型实例时限制用户权限的最佳做法是什么
【发布时间】:2015-08-22 22:48:34
【问题描述】:

我正在使用User Authentication 构建一个简单的应用程序。

我的应用有 3 个模型:

  • 用户:标准的 Django 用户模型
  • 位置:办公室模型(地址、站点名称等)
  • 员工:员工模型(姓名、电子邮件等)

我还有一系列允许用户登录、创建和编辑位置/站点等的视图。

我想知道,将模型实例的编辑限制为用户创建的实例的最佳做法是什么?例如。在没有修改的情况下,两个用户可以创建数据并且都可以编辑其他用户。我如何将其限制为编辑自己的?

我知道长格式方法是在每个模型上放置一个ForeignKey(User) 以使用queryset 限制视图,但这似乎冗长且繁琐。有没有我缺少的 Django 技巧?也许是装饰师?

最佳做法是什么?

【问题讨论】:

  • 如果用户只编辑他们自己的对象,IanAuld 的答案就是要走的路。否则,您可能拥有一组可以编辑所有对象的用户,您可以通过将这些用户放在一个组中来控制这一点。

标签: python django django-authentication django-permissions


【解决方案1】:

最简单的方法是编辑您的模型,使其具有owneruser 字段,即创建者的ForeignKey

class Locations(models.Model):
    owner = ForeignKey(User)
    ...

在你看来:

def edit_location(request, location_id):
    location = Locations.objects.get(pk=location_id)
    if request.user is not location.owner:
        # return a 401 or redirect to somewhere
    else:
        # do stuff

如果每个LocationUser 可以有多个关系,您可以使用Django 的ManyToManyField 选项。例如:

class Locations(models.Model):
    owners = models.ManyToManyField(User)

user = User.objects.create(username='Ian')
location = Locations.objects.create(...)
location.owners.add(user)

然后User/Locations 在两者上都可用:

>>> location.owners.all()
[<User: Ian>]
>>> user.locations_set.all()
[<Locations: ...>]

User 上的集合将自动创建并命名为&lt;Model Name&gt;_set

然后您可以使用in 运算符来检查所有权:

def edit_location(request, location_id):
        location = Locations.objects.get(pk=location_id)
        if request.user in location.owners.all():
            # return a 401 or redirect to somewhere
        else:
            # do stuff

【讨论】:

  • 谢谢。假设我想扩展它,以便 2 个用户可以编辑相同的数据。然后外键将不起作用(因为这是 1-1)。有什么想法吗?
  • ManyToManyField 应该可以工作,假设每个 User 可以有很多 Locations 并且每个 Location 可以有很多 User's
猜你喜欢
  • 2012-05-17
  • 2021-11-28
  • 2012-03-22
  • 1970-01-01
  • 2012-03-15
  • 2015-07-09
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多