Django Guardian - проверка прав доступа во время фильтрации - PullRequest
0 голосов
/ 14 апреля 2020

Я использую Django Хранитель, чтобы использовать разрешения экземпляра. Это хорошо работает, но у меня есть вопрос о фильтрации.

Допустим, у нас есть модели с именем FakeItem. Допустим, мы хотим отфильтровать список FakeItems только с элементом с указанным разрешением c.

@staticmethod
def purge_list(entity_list , userOrUsername, permission_name):
    requesting_user = userOrUsername
    if not isinstance(userOrUsername, User):
        requesting_user = User.objects.get(username = username)

    acl_listed = []
    total_rows = 0
    for entity in entity_list:
        if requesting_user.has_perm(entity, permission_name):
            acl_listed.append(entity)
            total_rows = total_rows + 1

    return { "list" :  acl_listed , "totals" : total_rows }

Это пример метода очистки списка от элемента, к которому пользователь может получить доступ.

К сожалению, этот метод называется ПОСЛЕ того, как я получаю полный список из базы данных с предыдущим фильтром. Мне нужно сделать O (n) целое по списку, чтобы очистить его.

Мне нужно что-то, чтобы очистить список непосредственно в исходном фильтре для оптимизации запроса.

search_filter = Q()
search_filter = search_filter & Q(name__icontains = "foo")
search_filter = search_filter & Q(some_guardian_filter)
already_purged_list = FakeItem.objects.filter(search_filter)

Guardian's Документация только объясняет, как использовать один метод, такой как has_perm et c ...

1 Ответ

1 голос
/ 14 апреля 2020

Я предлагаю реализовать следующий способ.

Создать объект QuerySet, используя get_objects_for_user . Он создает набор запросов и добавляет все фильтры для разрешения и для данного пользователя. Затем просто отфильтруйте другие значения, которые вам нужны. Смотрите пример ниже:

# returns the queryset filtered by permission and user
queryset = get_objects_for_user(user_object, permission_name)
return queryset.filter(name__icontains = "foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...