2

私は最初のプロジェクトをDRFで作成していますが、私は自分のビューセットのアクセス許可を設定する際にいくつか問題があります。私はすでにdjangorestframework-jwtで動作する認証を持っています。現在、いくつかの異なるビューセットが定義されています。私がしたいことは、モデルオブジェクトの所有者がそのオブジェクトに望みどおりの変更を加えることができるようにすることですが、ほかの人(管理者以外)がオブジェクトを見ることさえ禁止します。基本的には、特定のメソッドに権限クラスを適用して、管理者だけが「リスト」、「所有者を更新、破棄する」、認証されたユーザーを「作成」することを許可する必要があります。django rest framework viewsetに基づくアクセス許可

class Link(models.Model): 
    name = models.CharField(max_length=200) 
    url = models.URLField() 
    # another model with a OneToMany relationship 
    section = models.ForeignKey('homepage.LinkSection', related_name='links', on_delete=models.CASCADE 
    owner = models.ForeignKey('homepage.UserProfile'), related_name='links', on_delete=models.CASCADE) 

のモデルと私はそれがすることによってこれを達成することが可能だと確信してい

class IsOwner(permissions.BasePermission): 
    def has_object_permissions(self, request, view, obj): 
     return obj.owner == request.user.userprofile 

を適用する権限クラスで

class LinkViewSet(viewsets.ModelViewSet): 
    queryset = Link.objects.all() 
    serializer_class = LinkSerializer 

:現在、私はこのようなものを持っています完全なカスタム表示を書いていますが、これは特にこれを行う簡単な方法があるという気持ちを持っています。なぜなら、これは基本的にAPIを完成させるために最後にやることだからです。何か助けてくれてありがとう、さらに詳しい情報が必要な場合はお知らせください。

+0

[DjangoModelPermissions](https://github.com/encode/django-rest-framework/blob/master/rest_framework/permissions.py#L75)のように、 'has_object_permission()'の 'request.method'をチェックすることができます。そうです。 – kichik

+0

ありがとう、私はそれを把握することができた、私はポストへの答えを追加します。 –

答えて

3

私はここで、次のようにアクションがビューで使用されたチェックしてアクセス許可クラスを作成することができました:

class IsOwner(permissions.BasePermission): 
''' 
Custom permission to only give the owner of the object access 
''' 
message = 'You must be the owner of this object' 

def has_permission(self, request, view): 
    if view.action == 'list' and not request.user.is_staff: 
     print('has_permission false') 
     return False 
    else: 
     print('has_permission true') 
     return True 

def has_object_permission(self, request, view, obj): 
    print('enter has_object_permission') 
    # only allow the owner to make changes 
    user = self.get_user_for_obj(obj) 
    print(f'user: {user.username}') 
    if request.user.is_staff: 
     print('has_object_permission true: staff') 
     return True 
    elif view.action == 'create': 
     print('has_object_permission true: create') 
     return True 
    elif user == request.user: 
     print('has_object_permission true: owner') 
     return True # in practice, an editor will have a profile 
    else: 
     print('has_object_permission false') 
     return False 

def get_user_for_obj(self, obj): 
    model = type(obj) 
    if model is models.UserProfile: 
     return obj.user 
    else: 
     return obj.owner.user 

私のモデルはどのようにして矛盾しているので、get_user_for_objは、ヘルパーメソッドとしての私の実装のために特別ですユーザーインスタンスを取得します。 has_permissionがTrueを返すか、メソッドがオーバーライドされていない場合にのみ、has_object_permissionが実行されるので、has_permissionをあまり制限的にしたくありません。

関連する問題