37

Django 1.2+ の 3 つの行レベルのアクセス許可ソリューションを見つけました

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

4

2 に答える 2

25

まず、オブジェクト レベルのアクセス許可にこれらのいずれも使用していないということから始めましょう。オブジェクト レベルのアクセス許可をまったく回避できる場合は、そうしてください。整理するのは面倒です。

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

活発な開発:

  1. ジャンゴガーディアン (1週間前)
  2. django-object-permissions (1 年前)
  3. django-authority (ほぼ 2 年前)

API

  1. django-guardian (定義済みモデルのインスタンスを保存)
  2. django-object-permissions (登録権限)
  3. django-authority (クラスの定義)

ちなみに上は順番です。

私はガーディアンを純粋に API だけで使用することをお勧めしますが、ガーディアンがまだ開発中であるという事実は、通常は他の製品が開発されていないことを意味します。

于 2012-06-18T12:28:42.003 に答える
21

2013 年 8 月の時点で、django-object-permissions はdjango-permissionに取って代わられました。3 つのプロジェクトが活発に開発されています。

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

- 編集 -

ドキュメントの例。

ジャンゴガーディアン

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

アクセス許可を割り当てて、データベースに保持します。

ジャンゴ権限

宣言:

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 アクセス許可をラップしますが、ガーディアンでは実行できない上記のカスタム アクセス許可の柔軟性を見ることができます。

一般的なユースケース

生徒はクラスルームに所属できます。

ガーディアン:

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

権限:

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

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

于 2013-08-19T05:18:49.900 に答える