Djangoグループと権限を使用するにはどうすればよいですか?


83

私は基本的なユーザーのものを理解しています。認証、ログイン、アカウントの作成などを知っていますが、今はグループと権限に取り組みたいと思っています。

djangoグループ/パーミッションのドキュメントはどこにありますか?これはそうではありません:http//docs.djangoproject.com/en/dev/topics/auth/

回答:


121

最初に尋ねる必要がある質問は、どのようなアクセス許可が必要で、どのような種類かということだと思います。どのような意味で、モデルレベルとオブジェクトレベルのどちらが必要ですか。違いを明確にするために、モデルカーがあるとしましょう。すべての車に権限を付与する場合はモデルレベルが適切ですが、車ごとに権限を付与する場合はオブジェクトレベルが必要です。両方が必要な場合がありますが、これは後で説明するように問題ではありません。

モデルの権限については、Djangoがこれらを処理します...ほとんどの場合。モデルごとに、Djangoは「appname.permissionname_modelname」の形式で権限を作成します。車のモデルで「drivers」というアプリがある場合、1つの権限は「drivers.delete_car」になります。Djangoが自動的に作成する権限は、作成、変更、および削除されます。奇妙な理由で、CRUDからの読み取り権限を含めないことにしたので、自分でこれを行う必要があります。Djangoは、何らかの理由でCRUDの「更新」を「変更」に変更することを決定したことに注意してください。モデルにさらにアクセス許可を追加するには、たとえば読み取りアクセス許可を使用するには、Metaクラスを使用します。

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

パーミッションはタプルのセットであることに注意してください。タプルアイテムは、上記のパーミッションとそのパーミッションの説明です。permname_modelnameの規則に従う必要はありませんが、私は通常それに従います。

最後に、権限を確認するには、has_permを使用できます。

obj.has_perm( 'drivers.read_car' )

ここで、objはユーザーインスタンスまたはグループインスタンスのいずれかです。このための関数を書く方が簡単だと思います。

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

entityがアクセス許可をチェックするオブジェクト(GroupまたはUser)、modelがモデルのインスタンス、permsがチェックする文字列としてのアクセス許可のリスト(['read'、 'change']など)、appが文字列としてのアプリケーション名。上記のhas_permと同じチェックを行うには、次のように呼び出します。

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

オブジェクトまたは行のアクセス許可を使用する必要がある場合(それらは同じことを意味します)、Djangoはそれ自体では実際には役に立ちません。良い点は、モデルとオブジェクトの両方のアクセス許可を並べて使用できることです。オブジェクトのアクセス許可が必要な場合は、独自に作成するか(1.2以降を使用している場合)、他の誰かが作成したプロジェクトを見つける必要があります。私が気に入っているのは、washingtontimesのdjango-objectpermissionsです。


27
これは権限に対する優れた答えですが、グループとDjangoでの動作にはほとんど触れていませんか?
notSimon 2013

4
グループにはそれほど多くはありません。Linuxユーザーグループのように、ほとんどの場合、ユーザーをバンドルして権限を適用するためのものです。グループに許可を与えると、そのグループのすべてのメンバーに適用されます。ドキュメントには、すべてが実際に記載されています:docs.djangoproject.com/en/dev/topics/auth/default/#groups
Alex Kuhl 2013

1
ここで、このためにdjangoガーディアンの使用を検討したいことを指摘しなければならないと感じています。こちらの認証パッケージの内訳をご覧ください。また、このSOFリンクは優れた比較を提供します。
ジェフシェフィールド

1
これに遭遇し、オブジェクトの許可が必要になったとき、django-guardianを見つけました:django-guardian.readthedocs.org/en/v1.2
dArignac

1
「自分で書く」がダウンしています。か何か。今は中国語です。
WilliamKarlsson18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.