1. ホーム
  2. python

[解決済み] Djangoのグループとパーミッションはどのように使用するのですか?

2023-05-20 04:32:02

質問

基本的なユーザーに関することは理解しています。 私は認証、ログイン、アカウントの作成などを知っています。しかし、今私はグループとパーミッションに取り組みたいと思っています。

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

どのように解決するのですか?

最初の質問は、どのような権限が必要で、どのような種類なのか、ということだと思います。 どのような種類かというのは、モデル レベルかオブジェクト レベルかということです。 違いを明確にするために、モデル Car があるとします。 もし、すべての車に対してパーミッションを与えたいのであれば、モデルレベルが適切ですが、車ごとにパーミッションを与えたいのであれば、オブジェクトレベルが必要です。 両方が必要な場合もありますが、後ほど説明するように、これは問題ではありません。

モデルパーミッションについては、Django があなたのために処理してくれます...ほとんど。 各モデルに対して、Django は 'appname.permissionname_modelname' という形式でパーミッションを作成します。 もし 'drivers' というアプリと Car モデルがあれば、一つのパーミッションは 'drivers.delete_car' となります。 Django が自動的に作成するパーミッションは、 create, change, delete になります。 奇妙な理由で、CRUD からの読み取りパーミッションは含めないことにしたようで、 これは自分でやらなければなりません。 Django は、なぜか CRUD の 'update' を 'change' に変更することにしたことに注意し てください。 モデルにさらに権限を追加するには、例えば読み取り権限を追加するには、 Meta クラスを使います。

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

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

最後に、パーミッションをチェックするために、has_permを使用することができます。

obj.has_perm( 'drivers.read_car' )

ここで、objはUserまたはGroupのインスタンスです。 これについては、関数を書く方がシンプルだと思います。

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+を使用している場合) または他の人が書いたプロジェクトを見つけてください。 django-objectpermissions で、washingtontimes からです。