web-dev-qa-db-ja.com

django-object-permissions Vs Django-guardian Vs Django-authority

Django 1.2+の3つの行レベルの権限ソリューションを見つけました

誰かが他よりも推奨されているものがあるかどうか、彼らの主な違いは何ですか?

33
Akasha

まず、オブジェクトレベルのアクセス許可にこれらのいずれも使用しないと言うことから始めます。独自のカスタムメソッドを使用しますが、使用していなかったらよかったのにと思います。オブジェクトレベルのアクセス許可をまったく回避できる場合は、そうしてください。整理するのが面倒です。

これが私があなたが言及した3つのアプリを評価する方法です。

積極的な開発:

  1. Django-ガーディアン(1週間前)
  2. Django-object-permissions(1年前)
  3. Django-権限(ほぼ2年前)

API

  1. Django-guardian(定義されたモデルのインスタンスを保存する)
  2. Django-object-permissions(パーミッションの登録)
  3. Django-権限(クラスの定義)

ちなみに上記は順番です。

純粋にAPIだけで保護者をお勧めしますが、他の人が通常いない場所でまだ開発されているという事実は、大きな勝利を意味します。

24
Josh Smeaton

2013年8月に関しては、Django-object-permissionsは Django-permission に置き換えられました。 3つのプロジェクトは活発に開発されています。

個人的には、データベースを使用するDjango-guardianよりも、メソッドを使用してアクセス許可(ランタイム)をチェックする権限またはアクセス許可を好みます権限を保持するため(オブジェクトの作成時に添付、fe)。

-編集-

ドキュメントからの例。

Django-ガーディアン

_joe = User.objects.create(username='joe')
task = Task.objects.create(summary='Some job', content='', reported_by=boss)
joe.has_perm('view_task', task)
>> False
assign_perm('view_task', joe, task)
joe.has_perm('view_task', task)
>> True
_

権限を割り当ててデータベースに保存します。

Django-権限

宣言:

_class FlatpagePermission(permissions.BasePermission):
    label = 'flatpage_permission'
    checks = ('morning_flatpage_check',)

    def morning_flatpage_check(self, flatpage):
        hour = int(datetime.datetime.now().strftime("%H"))
        if hour >= 8 and hour <= 12 and flatpage.url == '/about/':
            return True
        return False

authority.register(Flatpage, FlatpagePermission)
_

使用法:

_def my_view(request):
    check = FlatPagePermission(request.user)
    flatpage_object = Flatpage.objects.get(url='/homepage/')
    if check.morning_flatpage_check(flatpage=flatpage_object):
        print "Yay, you can change *this* flatpage!"
_

また、標準のDjango権限をラップしますが、上記のカスタム権限には、保護者ではできない柔軟性があります。

一般的なユースケース

生徒はClassroomに所属できます。

ガーディアン

  1. Studentが新しいClassroomに割り当てられたら、Classroomオブジェクトを介してStudentに権限_'attend_classroom'_を添付します。
  2. StudentがClassroomから削除されたら、Classroomオブジェクトに対するStudentへの_'attend_classroom'_権限を削除します。
  3. Classroomにアクセスするときは、_'attend_classroom'_権限を確認してください。

権限

  1. カスタム権限ClassroomPermission.can_attend_classroom()を定義します。これにより、StudentがClassroomに属しているかどうかが照会されます。
  2. Classroomにアクセスするときは、ClassroomPermission.can_attend_classroom()を確認してください

権限は、チェックロジックを別のファイルに保持します。 Guardianには、残りのコードを通じてアタッチ/デタッチ権限が必要です。

19
laffuste