Проверяет ли разрешение групповые или индивидуальные разрешения?

Итак, у меня возникла небольшая путаница в отношении разрешений. Все мои таблицы сделаны в приложении под названием app. И каждый пользователь admin назначен на определенную группу, которая показана ниже.

image

Аналогично для каждой страницы, в зависимости от разрешения пользователя, он сможет получить доступ к различным страницам. И для каждого представления существует свой декоратор, как показано на рисунке.

2nd pic

В котором код написан в отдельном decorators.py файле.

def permissions_allowed(allowed=[]):
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):
            if not request.user.is_staff:
                messages.warning(request, "403 FORBIDDEN: You are not authorized to view the admin page!")
                return redirect('home')

            
            for perm in allowed:
                if not request.user.has_perm(perm):
                    messages.warning(request, "You don't have the permissions to complete this action. Please contact the admin!")
                    return redirect ('adminHome')

            return view_func (request, *args, **kwargs)
        return wrapper_func
    return decorator

Итак, мои вопросы:

  1. Is my syntax to check the permission correct? (as shown in the 2nd pic)
  2. When I use request.user.has_perm() does it check the group permissions? the individual permissions? or both of them?

Пожалуйста, дайте мне знать, что я делаю неправильно, поскольку код не работает так, как я хочу.

Спасибо!

Согласно документации has_perm() метод проверяет разрешение на уровне пользователя:

Возвращает True, если пользователь имеет указанное разрешение, где perm имеет формат <app label>.<permission codename>. (см. документацию по разрешениям). Если пользователь неактивен, этот метод всегда будет возвращать False. Для активного суперпользователя этот метод всегда будет возвращать True.

Так, если вы хотите проверить разрешение на уровне группы, вы можете использовать get_group_permissions():

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

Если вам нужны оба варианта, вы также можете рассмотреть возможность использования get_all_permissions().

В вашем случае вы уже проверяете стандартный атрибут user.is_staff, поэтому если вы сохранили id группы для рассмотрения, проверка разрешения групп, возможно, будет иметь больше смысла (нет стандартного метода, просто обычное использование M2M отношений между Group и Permission моделями)

Вернуться на верх