2017-10-05 10 views
0

私はdjangorestframeworkで遊んでいます。私の目標はGETリクエストに反応するビューにDjangoModelPermissionsを使用することです。公式ドキュメントには次のように書かれています。Django Rest FrameworkはListAPIViewでDjangoModelPermissionsを使用します

デフォルトの動作は、カスタムモデル のアクセス許可をサポートするようにオーバーライドすることもできます。たとえば、GETリクエストにview の許可を含めることができます。

Source

だから私は、次のように私のモデルを修正:

class User(AbstractUser): 
    display_name = models.CharField(_('Display Name'), blank=True, max_length=255) 

    class Meta: 
     permissions = (
      ("view_user", "Can view users"), 
     ) 

    def __str__(self): 
     return self.username 

とビュー:

class UserListAPIView(ListAPIView): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    permission_classes = (permissions.DjangoModelPermissions,) 

セッティング:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'rest_framework.permissions.DjangoModelPermissions' 
    ] 
} 

問題は、私が実装したUserListAPIViewは、Groupに属していないユーザーにすべてのオブジェクトのリストを正常に返します。いずれもカスタムUser Permissionを持っていません。 DjangoModelPermissionsは効果がありません。

class CustomDjangoModelPermission(permissions.DjangoModelPermissions): 

    def __init__(self): 
     self.perms_map['GET'] = ['%(app_label)s.view_%(model_name)s'] 
+0

ああ、私は自分でそれを実装する必要があると思う:https://github.com/encode/django-rest-framework/blob/master/rest_framework/permissions.py#L91ここで何か助けていただければ幸いです。 –

答えて

0

痛い、それは私が思ったよりも簡単でした。あなたが追加したいものは何でも余分な権限を追加

class ViewName(generic.ListApiView): 

     """ Trip listing view """ 

    model = model_name 
    serializer_class = serializer_class 
    permission_classes = (permissions.IsAuthenticated,BaseModelPerm) 
    queryset = model.objects.all() 
    extra_perms_map = { 
     'GET': ["can_view_trip"], 
    } 

の下のように使用することができますビューで

class BaseModelPerm(permissions.DjangoModelPermissions): 

    def get_custom_perms(self, method, view): 
      app_name = view.model._meta.app_label 
      return [app_name+"."+perms for perms in view.extra_perms_map.get(method, [])] 

    def has_permission(self, request, view): 
     perms = self.get_required_permissions(request.method, view.model) 
     perms.extend(self.get_custom_perms(request.method, view)) 
     return (
      request.user and 
      (request.user.is_authenticated() or not self.authenticated_users_only) and 
     request.user.has_perms(perms) 
    ) 

0

あなたは、カスタマーのDjangoModelPermissionsを上書きする必要があります。

関連する問題