Jquery 限制访问我的jsonifier的最简单方法?

Jquery 限制访问我的jsonifier的最简单方法?,jquery,ajax,django,security,permissions,Jquery,Ajax,Django,Security,Permissions,我写了一个小方法,它采用如下URL: /ajax/places/city?name__icontains=ranch 然后查询名称中包含“ranch”的城市的city模型,并将结果作为json返回: [ { "pk":24944, "model":"places.city", "fields":{ "province":1, "data_source":2, "elevation":null,

我写了一个小方法,它采用如下URL:

/ajax/places/city?name__icontains=ranch
然后查询名称中包含“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

我想找出最简单的方法来限制它。对于初学者,我可以将其限制在某些模型中,但对于地址之类的东西,我需要在一些自动完成中使用这些模型,但只有拥有该地址的用户才能看到它

我认为当通过ajax调用方法时,
请求
对象不能正确地传递(使用经过身份验证的用户),是吗


这是否意味着我必须在每个请求中传递某种身份验证密钥或会话id?即使我得到了登录的用户,我也不想在这个方法中加入太多的权限处理,我认为它不属于这个方法。不确定如何解决此问题。

如果您不想公开身份验证,则必须使用某种类型的身份验证。我的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中抓取。这就是为什么依赖您的登录体系结构是一个很好的解决方案。

如果您不想让它公开,必须使用某种类型的身份验证。我的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中抓取。这就是为什么依赖您的登录体系结构是一个很好的解决方案。

这看起来很像您试图允许来自客户端的任意查询

不要。如果要编写所有查询,请在服务器端编写它们,并为每个查询创建一个单独的方法。如果用户需要能够编写动态查询,请提出自己的(严格限制的)方法,而不是直接将内容传递给模型


顺便说一下,“Ajax”请求应该与正常页面加载没有什么不同。如果您使用Cookie进行身份验证,它们应该可以顺利通过。

这看起来很像您试图允许来自客户端的任意查询

不要。如果要编写所有查询,请在服务器端编写它们,并为每个查询创建一个单独的方法。如果用户需要能够编写动态查询,请提出自己的(严格限制的)方法,而不是直接将内容传递给模型


顺便说一下,“Ajax”请求应该与正常页面加载没有什么不同。如果您使用Cookie进行身份验证,它们应该可以顺利通过。

我通常就是这样做的。我有特定的控制器操作和预定义的安全查询,我允许用户访问。哪些操作需要身份验证也是通过控制器指定的。然后路由引擎解析请求,如果请求以
.json
结尾,查询结果将呈现在json视图中。或者,如果是
.rss
,则结果将呈现在rss视图中。否则,它将在默认HTML视图中呈现。有些操作会使用参数(如搜索词、排序键、排序顺序等),但不会进行任意查询。我只是想在开始编写代码的Javascript部分时节省一些时间……我不喜欢将所有内容都烘焙到服务器端代码中,并对每个模型进行复制,但我想我没有太多选择。我想我要建立一个白名单,这是我通常的做法。我有特定的控制器操作和预定义的安全查询,我允许用户访问。哪些操作需要身份验证也是通过控制器指定的。然后路由引擎解析请求,如果请求以
.json
结尾,查询结果将呈现在json视图中。或者,如果是
.rss
,则结果将呈现在rss视图中。否则,它将在默认HTML视图中呈现。有些操作会使用参数(如搜索词、排序键、排序顺序等),但不会进行任意查询。我只是想在开始编写代码的Javascript部分时节省一些时间……我不喜欢将所有内容都烘焙到服务器端代码中,并对每个模型进行复制,但我想我没有太多选择。我想我要建立一个白名单。