При выполнении пользовательских HTTP-аутентификации и методов, каков правильный порядок операций? - PullRequest
0 голосов
/ 07 января 2012

У меня есть приложение Django, которое свободно использует django.contrib.auth.decorators.login_required(), а также django.views.decorators.http.require_http_methods().Первый является декоратором, который проверяет, вошел ли текущий пользователь в систему, и перенаправляет его (с кодом 302, IIRC) на страницу входа в систему, если он не вошел в систему. Последний является декоратором, который проверяет метод запроса и возвращает 405 (методне реализовано), если метод отсутствует в переданном списке.Так, в качестве примера, функция представления может выглядеть следующим образом:

@require_http_methods(["GET", "POST", "DELETE"])
@login_required
def my_view(request):
    ...

Вот проблема: многие из этих представлений выполняют внутренние проверки разрешений, которые возвращают 403 (запрещено), если у пользователя недостаточно разрешений для ресурса.Согласно моим исследованиям, это плохо, потому что 403 должно произойти до проверки правильности метода.Однако без login_required() мне пришлось бы открывать код, который пользователь также проверяет в моих представлениях.

Кто-нибудь еще испытывал это?Есть ли правильный ответ?Я знаю, что это мошенничество, но недопустимо ли проверять методы, затем перенаправлять вход в систему, затем, наконец, проверять права пользователей или мне нужно реструктурировать эти представления?

1 Ответ

0 голосов
/ 07 января 2012

Я не совсем уверен в «правильности» вашего заказа, но для любой схемы разрешения сложных представлений я настоятельно рекомендую написать ваше собственное промежуточное программное обеспечение, чтобы позаботиться о проверке подлинности / разрешений представления. Вместо того, чтобы украшать каждое представление @login_required, я всегда просто позабочусь об этом в своем собственном промежуточном программном обеспечении.

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

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