首页 > 解决方案 > Django 限制用户访问相关对象

问题描述

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

模型.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")

视图.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,但应该不能这样做。

用户 Brett 不应该看到 ACME Corporation

我查看了ModelManager界面,但不确定如何获取用户请求并覆盖是否有一种方法可以为所有视图(DRY)运行编写一个查询,以便用户只能看到他们自己的组织?

标签: djangomodelpermissions

解决方案


有一种方法。

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

模型.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()

推荐阅读