Django限制用户对相关对象的访问

时间:2019-02-18 01:58:04

标签: django model permissions

我正在编写一个应用程序,该应用程序允许用户仅在其组织内验证和查看对象。对于generic.ListView,我可以使用以下代码限制访问权限:

models.py

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    organisation = models.ForeignKey('Organisation', null=True, on_delete=models.CASCADE)

class Organisation(models.Model):
    name = models.CharField(max_length=255, unique=True, null=False, verbose_name="Name")

views.py

class OrganisationList(LoginRequiredMixin, generic.ListView):
model = Organisation

def get_queryset(self):
    return Organisation.objects.filter(id=self.request.user.organisation.id)

除此视图外,用户还将访问需要此限制的表单,API和django管理界面。

例如,用户Brett属于Kids Incorporated。当他登录到管理面板时,他目前还可以看到ACME Corporation,但不能这样做。

User Brett should not see ACME Corporation

我看过ModelManager界面,但不确定如何获取用户请求和覆盖 有没有一种方法可以针对所有视图(DRY)编写一个查询,以便用户只能看到自己的组织?

2 个答案:

答案 0 :(得分:0)

有办法。

  1. 安装django-crequest软件包:https://github.com/Alir3z4/django-crequest#installing
  2. 在models.py中创建一个model.Manager,并覆盖get_queryset方法

models.py

...
from crequest.middleware import CrequestMiddleware

class UserOrganisationManager(models.Manager):
def get_queryset(self):
    request = CrequestMiddleware.get_request()
    return super().get_queryset().filter(id=request.user.organisation.id)


class Organisation(models.Model):
    name = models.CharField(max_length=255, 
                            unique=True, null=False, verbose_name="Name")
    ...
    objects = UserOrganisationManager()

答案 1 :(得分:0)

为此,您应该使用groups and permissions,每个组织一个组。而且只有某个组的成员才能读取(其权限)在其组织组中。

这将使您为一个用户拥有一个以上的组织,反之亦然。当然,不需要任何其他依赖性。