1

私は、django-rulesのヘルプを探している新しいdjangoユーザーです。私は'OR'ベースの認証システムを設定しようとしています。私は 'ファイル'モデルを持っています。私は作成者だけがそれを削除できるようにしたいが、それを編集するための特定のユーザーセットが必要です。私はチュートリアルと実装を続けてきました。それはシェルでは動作しますが、私のサイトでは動作しません。現時点では、誰も何も削除または更新できません。私の見解は、現在のように見えるdjango-rulesの認証を実装することができません

class FileUpdateView(PermissionRequiredMixin, generics.RetrieveUpdateAPIView): 
    """ 
    View updating details of a bill 
    """ 
    queryset = File.objects.all() 
    serializer_class = FileSerializer 
    permission_required = 'fileupload.change_file' 
    raise_exception = True 

class FileDeleteView(PermissionRequiredMixin, generics.RetrieveDestroyAPIView): 
    """ 
    View for deleting a bill 
    """ 
    queryset = File.objects.all() 
    serializer_class = FileSerializer 
    permission_required = 'fileupload.delete_file' 
    raise_exception = True 

ルール自体は、次のとおりです。私はただ一歩を欠けているように私は感じる近いよ

import rules 

@rules.predicate 
def is_creator(user, file): 
    """Checks if user is file's creator""" 
    return file.owner == user 

is_editor = rules.is_group_member('ReadAndWrite') 

rules.add_perm('fileupload.change_file', is_editor | is_creator) 
rules.add_perm('fileupload.delete_file', is_creator) 

知っています。

ありがとうございます!

答えて

0

& Django-rulesの設定ファイル認証バックエンドを確認してください。また、Djangoの残りの権限とDjangoのルールの権限を混在させています。ビュー上でDjango-restパーミッションのDjango-rulesパーミッションをチェックする必要があります。

です。

このようにrest-frameworkでカスタム権限を定義します。

from rest_framework import permissions 


class RulesPermissions(permissions.BasePermission): 
    def has_object_permission(self, request, view, obj): 
     return request.user.has_perm('books.edit_book', obj) 

in viewset。

class BookView(viewsets.ModelViewSet): 
    permission_classes = (RulesPermissions,) 
0

私はプロジェクトのためのDjango RESTフレームワークとジャンゴ・ルールでの作業や、あなたの質問への答えを見つけてきました。

django RESTフレームワークは、ルール 'views.PermissionRequiredMixinと互換性のないAPIビューを使用するため、APIディスパッチ中に呼び出される承認ワークフローとメソッドは、djangoのクラスベースのビューとは異なります。あなたは、各ルールの許可のためのRESTフレームワーク許可を書くことを強制していない。このミックスインで

import six 
from django.core.exceptions import ImproperlyConfigured 


class PermissionRequiredMixin: 

    permission_required = None 

    def get_permission_object(self): 
     object_getter = getattr(self, 'get_object', lambda: None) 
     return object_getter() 

    def get_permission_required(self): 

     if self.permission_required is None: 
      raise ImproperlyConfigured(
       '{0} is missing the permission_required attribute. Define ' 
       '{0}.permission_required, or override ' 
       '{0}.get_permission_required().' 
       .format(self.__class__.__name__) 
      ) 

     if isinstance(self.permission_required, six.string_types): 
      perms = (self.permission_required,) 
     else: 
      perms = self.permission_required 

     return perms 

    def check_permissions(self, request): 
     obj = self.get_permission_object() 
     user = request.user 
     missing_permissions = [perm for perm in self.get_permission_required() 
           if not user.has_perm(perm, obj)] 
     if any(missing_permissions): 
      self.permission_denied(
       request, 
message=('MISSING: {}'.format(', '.join(missing_permissions)))) 

はジャンゴRESTフレームワークAPIのビューとそのサブクラスのため、以下のミックスインを試してみてください。

関連する問題