限制访问jsonifier的最简单方法是什么?

时间:2011-02-03 01:29:07

标签: jquery ajax django security permissions

我写了一个带有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)。

我正在试图找出限制它的最简单方法。我可以将它限制为初学者的某些模型,但对于像地址这样的东西,我需要在某些自动填充中使用它们,但只有拥有该地址的用户才能看到它。

当通过ajax调用方法时,我认为request对象没有正确传递(使用经过身份验证的用户),是吗?

这是否意味着我必须传递某种身份验证密钥或会话ID以及每个请求?即使我确实获得了登录用户,我也不想将过多的权限处理用于该方法,我认为它不属于那里。不知道如何处理这个问题。

2 个答案:

答案 0 :(得分:3)

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

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

顺便说一句,“Ajax”请求应该与正常的页面加载没有区别。如果您使用cookie进行身份验证,那么它们应该可以通过。

答案 1 :(得分:1)

如果您不希望公开身份验证,则必须使用某种类型的身份验证。我的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中获取此令牌。这就是为什么依靠您的登录架构是一个很好的解决方案。