2011-02-03 4 views
0

私は次のようにURLを取る少し方法を書いた:自分の名前で「牧場」を持っている都市のcityモデルを照会し、JSONとして結果を返します。そして、jsonifierへのアクセスを制限する最も簡単な方法は?

/ajax/places/city?name__icontains=ranch 

[ 
    { 
     "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を入力することができます)ユーザーが自分のデータベースへの無制限のアクセスを与えることです。

私はそれを少し制限する最も簡単な方法を見つけようとしています。特定のモデルに限定することができますが、Addressesのようなものについては、いくつかのオートコンプリートでそれらを使用する必要がありますが、そのAddressを所有するユーザーだけがそれを見ることができます。

メソッドがajax経由で呼び出されたときに、requestオブジェクトが(認証されたユーザーと共に)正しく渡されるとは思いませんか?

これは、リクエストごとにいくつかの種類の認証キーまたはセッションIDを渡す必要があることを意味しますか?そして、たとえ私がログインしているユーザーを取得しても、私はあまりにも多くのアクセス権をその方法に焼きたいとは思いません。私はそこに所属しているとは思いません。この問題にどのようにアプローチするかは不明です。

答えて

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から取得することができないことに注意する必要があります。そのため、ログイン・アーキテクチャーに頼ることは良い解決策です。

3

これは、クライアント側から任意のクエリを許可しようとしているようです。

しないでください。すべてのクエリを記述している場合は、それらをサーバー側に書き込み、それぞれのクエリを個別に作成します。ユーザーが動的クエリを記述できる必要がある場合は、モデルに直接渡すのではなく、独自の方法を考えてください。

ちなみに、「Ajax」リクエストは通常​​のページ読み込みと同じである必要があります。あなたが認証のためにクッキーを使用する場合、それらはちょうどうまく合格するはずです。

+0

これは私が通常やる方法です。私は、ユーザーがアクセスできるように事前定義された安全なクエリを備えた特定のコントローラアクションを持っています。どのアクションが認証を必要とするかは、コントローラーによっても指定されます。ルーティングエンジンはリクエストを解析し、リクエストが '.json'で終了すると、クエリ結果はJSONビューで表示されます。また、 '.rss'の場合、結果はRSSビューで表示されます。それ以外の場合は、デフォルトのHTMLビューでレンダリングされます。アクションによっては、パラメータ(検索キーワード、ソートキー、ソート順など)を取りますが、任意のクエリは使用しないアクションもあります。 –

+0

このコードのJavascript部分を書いてみると時間を節約しようとしています...すべてをサーバーサイドのコードに焼き付けて各モデルの重複をすべて取るのが好きではありませんが、多くの選択肢があります。私は一種のホワイトリストを作るつもりだと思う。 – mpen

関連する問題