Djangoでは、ユーザとグループのユーザにオブジェクトに対するカスタムパーミッションを与えることができます。(django-guardian
はこれを使う良い方法を追加します)。ユーザーを階層化する方法はさまざまです。私がしたいのは、アクセス許可自体に2つのタイプの階層を追加することです。たとえば、ある人がBook
オブジェクトに対して与えられた許可を持っている場合、私は彼らに暗黙のうちに各Page
オブジェクトに対してその許可を持たせたいと思う。また、誰かがPage
にchange
のアクセス権を持っている場合、暗黙のうちにそのPage
にview
のアクセス許可を持たせてもらいたいと思います。要するにDjangoのパーミッションの階層化 - モデルや他のパーミッションから継承
、私はpage.has_permission('view', user)
がpage.has_permission('*edit*', user)
とpage *.book* .has_permission('view', user)
の両方をチェックし、book.has_permission('view', user)
のために自分自身にbook.has_permission('*edit*', user)
を確認したいです。
私はdjango-rules
のような複雑なものは必要ありません。私は大きな数値を持たないため、一般的な外部キー手法を好んでおり、モデル構造はきれいで集中しています。私は、ビュー内のこれらのパーミッション関係、または複雑なモデルのロジックを繰り返さないようにしたいと思います。理想的には宣言的に、どこかでこのパーミッション構造を集中管理するのが理想的です。例次に
perm_hierarchy = {'view': ['edit', 'delete', ]}
model_perm_hierarchy = { Page : [Chapter, ],
Chapter : [Book, ]}
そのPage
オブジェクトに'edit'
と'delete'
パーミッションため'view'
Page
にチェックするためのチェックこと層。
同様に、アクセス許可をPage
にチェックするときは、同じアクセス許可(Chapter
に対して同じ名前付きアクセス許可が定義されている)の場合はChapter
をチェックします。
私はこの間違いを考えていると言われて非常に満足しています。