web-dev-qa-db-ja.com

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

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

Django groups/permissions?のドキュメントはどこにありますか?これはそうではありません: http://docs.djangoproject.com/en/dev/topics/auth/

79
TIMEX

私があなたに尋ねる必要がある最初の質問は、あなたがどんな許可が必要で、どんな種類であると思います。どのような意味で、モデルレベルまたはオブジェクトレベルが必要ですか。違いを明確にするために、モデルカーがあるとします。すべての車に許可を与えたい場合はモデルレベルが適切ですが、車ごとに許可を与えたい場合はオブジェクトレベルが必要です。あなたは両方を必要とするかもしれません、そして、これは我々が見るように問題ではありません。

モデルの権限の場合、Django=はこれらを処理します...ほとんど。各モデルに対してDjangoは 'appname.permissionname_modelname'の形式で権限を作成します。 Carモデルの 'drivers'というアプリがある場合、1つのアクセス許可は 'drivers.delete_car'になります。Djangoが自動的に作成するアクセス許可は、作成、変更、削除です。何らかの奇妙な理由でCRUDからの読み取りアクセス許可を含めないことにしたので、自分でこれを行う必要があります。Djangoは、何らかの理由でCRUDの 'update'を 'change'に変更することにしました。モデル、読み取り権限など、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.__) ):
            return False
    return True

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

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

オブジェクトまたは行のアクセス許可を使用する必要がある場合(同じことを意味します)、Djangoだけでは本当に役に立ちません。素晴らしいことは、モデルとオブジェクトの両方のアクセス許可を使用できることです。オブジェクトのアクセス許可が必要な場合は、 独自の書き込み (1.2+を使用している場合)または他の誰かが書いたプロジェクトを見つける必要があります。私が気に入っているのは Django-objectpermissions ワシントンタイムズから。

117
Alex Kuhl