2012-09-03 21 views
6

Tastypie 0.9.11を使用していて、認証されていないユーザーに、 APIキー認証で認証し、そのユーザーは同じモデルに対して追加/変更/削除操作を実行できます。Tastypie - 許可された書き込み権限を許可している間に、認証されていないユーザーに対して読み取り専用の許可を許可する

APIキー認証の使用+ Django認可は要件1を満たしていません(認証されていないユーザーはAPIにアクセスできません)。 認証を使用しないと、ユーザーはAPIキー(要件2を満たさない)で認証されることはありません。

私はこの動作を実現する簡単な方法があると思いますので、助けてください。

多くのおかげで、 のYuvalコーエン

答えて

8

あなたが考慮する必要がある2つのものがあります。認証と承認。

まず、リクエストメソッドがGETの場合はAPIキーに関係なくすべてのユーザーを認証する必要があります。他のすべてのメソッドではApiKeyAuthenticationを使用します。

ここで、認証されたすべてのユーザーは、承認の対象となります。ここでは、GET要求が常に許可されていることを確認する必要もあります。このような何かあなたが始める必要があります。

from tastypie.resources import ModelResource 
from tastypie.authentication import ApiKeyAuthentication 
from tastypie.authorization import DjangoAuthorization 

class MyAuthentication(ApiKeyAuthentication): 
    """ 
    Authenticates everyone if the request is GET otherwise performs 
    ApiKeyAuthentication. 
    """ 

    def is_authenticated(self, request, **kwargs): 
     if request.method == 'GET': 
      return True 
     return super(MyAuthentication, self).is_authenticated(request, **kwargs) 

class MyAuthorization(DjangoAuthorization) 
    """ 
    Authorizes every authenticated user to perform GET, for all others 
    performs DjangoAuthorization. 
    """ 

    def is_authorized(self, request, object=None): 
     if request.method == 'GET': 
      return True 
     else: 
      return super(MyAuthorization, self).is_authorized(request, object) 

class MyResource(ModelResource): 

    class Meta: 
     authentication = MyAuthentication() 
     authorization = MyAuthorization() 

だから、基本的ApiKeyAuthenticationDjangoAuthorizationを使用するため、あなたのアプローチは、GETリクエストのための特別な治療を欠いていました。

+0

詳細ソリューションをお寄せいただきありがとうございます。それはうまくいく。 DjangoAuthorizationはすでにGETリクエストを常に許可しているので、私はMyAuthorizationをスキップしました。 –

+0

あなたは歓迎です:)私はうまく働いてうれしいです。 – kgr

関連する問題