4

django-tastypieを使用して API を作成しています。django-guardianが修正できることを望んでいるカスタム許可の問題が 2 つあります。

臨床医と患者の 2 つのユーザー グループがあります。臨床医は自分の患者のみに属するオブジェクトにアクセスできる必要があり、患者は自分で作成したオブジェクトにのみアクセスできる必要があります。

私のコードは次のとおりです。

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'auth/user'
        excludes = ['email', 'password', 'is_superuser']


class BlogPostResource(ModelResource):
    author = fields.ToOneField(UserResource, 'author', full=True)

    class Meta:
        queryset = BlogPost.objects.all()
        resource_name = 'posts'
        allowed_methods = ["get", "post"]
        # Add it here.
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()
        filtering = {
            'author': ALL_WITH_RELATIONS,
        }

アクセス許可を使用してこれへのアクセスを制限するにはどうすればよいBlogPostResourceですか?

4

2 に答える 2

4

これは、カスタムのAuthorizationクラスを使用して実現できます。たとえば、次のようになります。

class CustomAuthorization(Authorization):
    def apply_limits(self, request, object_list):     
        ...
        clin_group = Group.objects.get(name='YOUR GROUP')
        if request and hasattr(request, 'user'):
            if clin_group in request.user.groups.all(): 
                 object_list = object_list.filter(user__in=request.user.patients.all()) # or however you stop clinician>patient relation
            else:
                 object_list = object_list.filter(user=request.user)
        return object_list 
于 2013-03-18T13:13:44.000 に答える
3

@JamesOからの回答に基づいて最終的な解決策を作成しました。彼の答えの問題は、クラスが書き直される前に古いバージョンの django-tastypie 用に書かれたことでした 。将来の参考のために私のコードは次のとおりです。Authorization

from tastypie.authorization import Authorization
from django.contrib.auth.models import Group
from extendedusers.models import ExtendedUser


class CustomAuthorization(Authorization):
    def read_list(self, object_list, bundle):
        clinician_group = Group.objects.get(name='clinician')
        if bundle.request and hasattr(bundle.request, 'user'):
            if clinician_group in bundle.request.user.groups.all():
                patients = ExtendedUser.objects.filter(clinician_id=bundle.request.user.id)
                object_list = object_list.filter(author__id__in=patients)
            else:
                object_list = object_list.filter(author=bundle.request.user)
            return object_list
        else:
            return object_list.none()
于 2013-03-18T16:27:48.577 に答える