Djangoは、権限ベースのWebアプリに適していますか?
-
04-07-2019 - |
質問
私はDjangoの詳細を1週間ほど調査してきましたが、私が見ているものが好きです。しかし、CRUDインターフェースへのアクセス権のきめ細かな制御に関連して否定性があります。
私が書いているのは、イントラネットクライアント管理Webアプリです。組織は約6層であり、層に基づいてクライアントグループへのアクセスを制限する必要があります。継続的に拡大。私はこれをどのように行うかについてかなり良いアイデアを持っていますが、事前に構築された管理インターフェイスにうまく統合できるかどうかはわかりません。
Djangoの開発は絶対にゼロにしました。それ以外の場合は、これが機能するかどうかについて、より良いアイデアが得られるでしょう。生成された管理インターフェイスがこのプロジェクトに役に立たない場合は、おそらくDjangoを使用しませんが、先ほど述べたように、きめの細かいカスタムアクセス許可に大きく依存しています。
Djangoでカスタムパーミッション/ルールを作成し、管理CRUDインターフェースにシームレスに統合できますか?
Update One:管理アプリを使用して、CRUDインターフェースの生成の繰り返しを最小限に抑えたいので、そうする必要があります。
更新2:
このプロジェクトに必要な権限を説明します。
クライアントは、1つまたは複数の「ストア」に属することができます。フルタイムの従業員は、自分の店でクライアントを編集できるだけです(別の店に属している場合でも)。ただし、別のストアでクライアントを表示/編集することはできません。カジュアルは、登録されているストアに基づいてのみクライアントを表示できるはずです(または、カジュアルがストアユーザーとしてログインしている場合-可能性が高い)。
管理職は、管理する店舗のすべての従業員を見ることができる必要があります。
上級管理職は、すべての従業員を編集し、自身の下に権限を付与できる必要があります。
djangoのドキュメントを読んだ後、グループのサブセットに(自動で)アクセス権を設定することはできないと書かれています。グループ全体のみ。この目的のために独自の権限をモックアップするのは簡単ですか?
解決
更新された要件を正しく読んだ場合、Djangoの既存の認証システムでは十分ではないと思います。完全なACLシステムが必要なようです。
この主題は何度も登場しました。 django + aclでググリングしてみてください。
ランダムサンプリング...
数年前にSummer of Codeプロジェクトがありましたが、どこに着いたのかわかりません。 http://code.djangoproject.com/wiki/GenericAuthorization
をご覧ください。興味深いことがあるdjngoproject.orgに新しいチケットがあります:
dumpz.orgにはいくつかの興味深いコードがあります:
- http://dumpz.org/274/ models.py
- http://dumpz.org/273/ Signals.py
...ただし、ドキュメントはありません。
がんばって!
他のヒント
Djangoの許可システムは完全に支配しています。各モデルには、デフォルトの許可セットがあります。モデルに新しい権限を追加することもできます。
各ユーザーには、グループメンバーシップと同様に一連の権限があります。個々のユーザーに個別の権限を付与できます。また、グループメンバーシップから権限を継承します。
ビュー関数(およびテンプレート)は、使用する必要がある粒度のレベルで、これらの権限の有無を簡単に確認できます。
これで十分ではない場合、プロファイルアドオンには、「ユーザー」を定義するためのさらに多くのオプションがあります。およびその機能、権限、役割、責任など。
そして、これで十分でない場合は、独自の認証スキームを定義できます。
重要なのは、定義された役職や役割ではなく、ユーザーの実際のサブセットであるグループを定義しようとしないことです。 「グループのサブセットに権限を設定する」必要はありません。より小さなグループが必要です。人々のサブセットを中心に定義されたグループ。
Djangoのデフォルトの許可は、モデル内の行アクセスではなく、モデルアクセスを中心にしています。一方、問題は、クライアント、ストア、従業員、マネージャーなどのいくつかのモデルの行のサブセットに関するものです。
これらのアイテムには基本的なFKのセットと、行をサブセット化するためのフィルターが必要です。デフォルトの管理ページでこれを行うのに問題があるかもしれません。特殊なフィルターを使用するには、独自のバージョンのadminが必要になる場合があります。
Django許可システムでそれができない場合は、ユースケースを再考する必要があります。真剣に。
[ただし、Django-RESTインターフェイスは完全に別の獣であり、多少の注意と摂食が必要です。]
ModelAdmin オブジェクトにはログインユーザーに関する許可を強制するために使用できる has_add_permission
、 has_change_permission
、 has_delete_permission
および queryset
メソッド表示および変更できます-これらを使用するサブクラスを作成して、実装する権限を強制し、サブクラスを使用してすべてのモデルを admin
アプリケーションに登録できます。
ただし、それはすべて、許可システムがどのように機能するかによって異なります。きめの細かい許可から外れた正確な要件は何ですか? admin
アプリケーションが行うように設計されたものから離れるほど、より多くの作業が必要になりますが、カスタム要件を実装するために使用できる多くのフックがあります。以下は、ルークプラントのブログ投稿です。深く掘り下げることなくできるチューニング。
絶対に admin
アプリケーションに基づいている必要がありますか? 汎用ビューおよび ModelForms は、多くの面倒な作業を処理できます。 CRUDを実装しているため、 のカスタマイズにハングアップしすぎるのを警戒して
admin - admin
アプリにハングアップすることから始めるDjangoの伝統であり、最初はもうコードを書く必要はないと思って;)
django 1.2から行レベルのアクセス許可がサポートされます。これは django-guardian によって作成されます。非常に直感的に操作できます。
また、粒状の許可のモンキーパッチを確認することもできます。 http://code.google.com/p/django-granular-permissions/
djangoの許可システムに行レベルの許可を追加します。