Ограничение доступа к сервисам Ajax с помощью django.contrib.auth - PullRequest
2 голосов
/ 09 марта 2011

В веб-приложении, уже использующем django.contrib.auth для аутентификации, я ищу "стандартный" подход для ограничения доступа к сервисам Ajax только для аутентифицированных пользователей.

Использование декоратора @login_required не подходит, потому что это просто перенаправляет неаутентифицированных пользователей на страницу входа.Для службы нам, вероятно, следует отправлять верный, правильно сформированный ответ об ошибке, а не какую-либо форму входа.

Это первый подход, который приходит на ум:

from django.http import HttpResponse

def some_json_service_view(request):
    if not request.user.is_authenticated():
        return HttpResponse('{success: false}')
    return HttpResponse('{success: true}')

Если сделать еще один шаг вперед, если бы я мог стандартизировать один и тот же ответ для всех «неаутентифицированных» ошибок, тогда было бы неплохо использовать декоратор:

from django.http import HttpResponse

def login_required_json(f):
    def new_f(request):
        if not request.user.is_authenticated():
            return HttpResponse('{success: false}')
        return f(request)
    return new_f

@login_required_json
def some_json_service_view(request):
    return HttpResponse('{success: true}')

Так ли это делают все остальные, или естьболее приемлемый способ это сделать?В идеале, кто-то может указать мне на пакет django.contrib, созданный для этой цели.

1 Ответ

3 голосов
/ 09 марта 2011

Это пример, который будет отлично работать, если сервисы AJAX используются только вашими клиентскими приложениями. Я делаю это все время, потому что один и тот же дизайн используется для передачи клиенту всех других типов данных посредством ответа, для которого клиент должен выполнить дополнительные действия или иным образом предоставить некоторую обратную связь пользователю. Он отлично работает, когда на вашем сайте смешанные пользователи, то есть вы поддерживаете как анонимных, так и зарегистрированных пользователей.

Если ваши сервисы сборки для сторонних поставщиков, вам придется либо использовать OAuth, базовую аутентификацию доступа HTTP или дайджест-аутентификацию доступа HTTP. Это происходит, когда вы знаете / предполагаете, что все пользователи, выполняющие запросы, имеют зарегистрированные учетные данные. Следовательно, эти схемы аутентификации позволяют пользователю аутентифицировать себя, если система аутентификации запрашивает у него учетные данные, которые они могут немедленно предоставить под рукой, без необходимости вручную вводить их на перенаправленной странице входа в систему.

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

В любом случае я предлагаю вам взглянуть на Джанго-поршень . Это как довольно простой контроллер для анализа запросов AJAX и сериализации ответов AJAX. Основываясь на предоставленной модели и HTTP-глаголе, он может автоматически сделать большую работу для вас при предоставлении доступа к модели пользовательским агентам, плюс он также поставляется с OAuth и HTTP-аутентификацией доступа.

...