Ограничение доступа к объектам в Джанго - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть конкретная модель, и у этой модели есть точные настройки доступа.Примерно так:

class Document(models.Model):
    ...
    access = models.ManyToManyField(Group)

Группы состоят из определенных тегов, и эти теги связаны с пользователями.Короче говоря, так или иначе документы доступны только определенным пользователям.Очень важно, чтобы эта проверка не проскальзывала сквозь трещины.Так что я вижу несколько вариантов.Во-первых, каждый раз, когда я получаю доступ к Документу, я добавляю проверку:

Document.objects.filter (access__group__tag__user = request.user)

Но есть два недостатка: а) Я запрашиваю модель документов> 100 раз в своих представлениях, чтобы у меня было МНОГО повторного кода, и б) вполне вероятно, что кто-то в какой-то момент забудет добавить это ограничение, оставив документы открытыми.

Так что я думаю, что перезапись объектов () наиболее целесообразна с помощью специального менеджера.Таким образом, я не дублирую код и не рискну забыть сделать это.

class HasAccessManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(access__group__tag__user=request.user)

class Document(models.Model):
    ...
    access = models.ManyToManyField(Group)
    objects = HasAccessManager()

Однако проблема заключается в том, что запрос там недоступен:

имя «запрос» не определено

Как решить эту проблему?Или есть лучшие решения?

1 Ответ

1 голос
/ 21 сентября 2019

Создайте миксин, который наследует ваши взгляды.Это предотвратит дублирование кода везде.Вы захотите написать модульные тесты, чтобы убедиться, что ваши представления правильно заблокированы.

class HasAccessMixin(object):
    def get_queryset(self):
        qs = super().get_queryset()

        # you can still leverage a custom model manager here if you want
        # qs = qs.custom_method(access__group__tag__user=self.request.user)

        qs = queryset.filter(access__group__tag__user=self.request.user)
        return qs

class SomeListView(HasAccessMixin, ListView):
    ...

class SomeDetailView(HasAccessMixin, DetailView):
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...