1

私はかなり新しくdjango restフレームワークです。パーミッションをシリアライザで確認する、Django rest framework、

私は組織のメンバーであり、あるグループのメンバーであるユーザーを持っています。

class SomeModel: 
    organization = models.ForeignKey(Organization) 
    name = models.CharField() 

ユーザーのみcreate/updateSomeModel、自身の組織のために、彼はまたcreate/updateあらゆる組織にとって彼ができる「コーディネーター」のグループの場合は次のことができます。 は、私たちがモデルを考えてみましょう。

現在、私のアプローチは、データがすでに検証されているので、.create().update()方法で、シリアライザでこれらの条件をチェックすることですし、私はそこにPermissionDeniedエラーを上げています。しかし、これは「正しい方法」ではないと感じています。私はカスタムの権限クラスを作ろうとしましたが、データは検証されません。なぜなら、権限クラスはシリアライザの前にチェックされているからです。 これにどのようにアプローチすればよいですか?

ご迷惑をおかけして申し訳ございません。私の母国語ではありません。 ありがとう!

EDIT: 例: 要求データがあるようなもの:

payload = {'organization': 1, 'name': 'Name'} 

したがって、ユーザーは、組織1からであるか、彼は、コーディネータのアクセスが許可されるべきだとSomeModel

+1

カスタムアクセス許可クラスを使用する場合、ユーザーが作成/更新する権限を持っていない場合、なぜデータをさらに検証する必要がありますか? –

+1

作成中のモデルの組織が存在するかどうかを確認する必要があります。 –

+0

私は問題を理解するのに役立つかもしれない例を加えました... –

答えて

4

を作成する必要がある場合カスタムアクセス許可クラスHasWritePermissionsを作成します。ユーザーが書き込み権限または更新権限を持っているかどうかを確認します。

custom permission classを作成するには、BasePermissionクラスをオーバーライドしてhas_permission()メソッドを実装する必要があります。このメソッドは、要求が許可アクセスの場合はTrue、そうでない場合はFalseを返します。

class HasWritePermissions(BasePermission): 

    def has_permission(self, request, view): 
     # grant access to non-create/update requests 
     if request.method not in ['POST', 'PUT', 'PATCH']: 
      return True 

     # grant access if user is a member of organization of the object 
     # to be modified or is a coordinator 
     if (organization in user.organizations) or (user_is_a_coordinator): 
      return True 

     # Otherwise don't grant access 
     return False 
+1

オブジェクトの組織をチェックするには、まず要求データを検証する必要がありますか?または、現在どのようにオブジェクトを作成していますか? –

+0

はい、このメソッドを使用して作成/更新を処理するには、IDを使用して組織オブジェクトのルックアップを実行し、ユーザーの組織内でそのオブジェクトをチェックする必要があります。 –

+0

しかし、組織のフィールドが要求ペイロードに存在しないか、組織IDがデータベースに存在しない場合はどうなりますか?それは、いくつかの望ましくない状態500のエラーを引き起こすでしょう...私はこのすべてをチェックすることができますが、それはシリアライザとバリデーターのためのものですか? –

関連する問題