Самый простой способ ограничить доступ к моему jsonifier? - PullRequest
0 голосов
/ 03 февраля 2011

Я написал небольшой метод, который принимает URL, например:

/ajax/places/city?name__icontains=ranch

Затем запрашивает модель city для городов с ранчо в названии и возвращает результаты в виде json:

[
   {
      "pk":24944,
      "model":"places.city",
      "fields":{
         "province":1,
         "data_source":2,
         "elevation":null,
         "name":"108 Mile Ranch",
         "feature_class":null,
         "time_zone":null,
         "longitude":null,
         "feature_code":null,
         "mod_date":"2011-02-02 01:33:17",
         "latitude":null,
         "is_verified":true,
         "population":null
      }
   }, ...

Это будет удобно для моих различных автозаполненных виджетов.

Метод выглядит так:

def lookup(request, app_label, model_name):
    model = get_model(app_label, model_name)
    kwargs = dict((k,v) for k,v in request.GET.iteritems())
    objects = model.objects.filter(**kwargs)[:25]
    json = serializers.serialize('json', objects)
    return HttpResponse(json, mimetype='application/json')

Единственная проблема заключается в том, что он предоставляет пользователям неограниченный доступ к моей базе данных (они могут вводить /ajax/auth/user).

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

Я не думаю, что объект request передается правильно (с аутентифицированным пользователем), когда метод вызывается через ajax, не так ли?

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

Ответы [ 2 ]

3 голосов
/ 03 февраля 2011

Похоже, вы пытаетесь разрешить произвольные запросы со стороны клиента.

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

Кстати, запрос "Ajax" не должен отличаться от обычной загрузки страницы. Если вы используете куки для аутентификации, они должны пройти нормально.

1 голос
/ 03 февраля 2011

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

<?php
    require ('common.php'); //Validates users and populates the $me array using SESSION, and datastore

    if ( !$me['validLogin'] ) {
        die(json_encode(array(
            "status" => "ERR", 
            "message" => "Invalid Access"
        )));

    }
    //Do the rest of your API Magic here

?>

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

...