2009-04-15 9 views
2

ミドルウェアは、画像ID( "/ image/152 /")などのURLに値が含まれているかどうかを確認して、現在のユーザーを確認するためのチェックを行いますその画像を表示する権限があり、別のURLにリダイレクトしない場合Django Middleware + URLの

私は作業しているこのサイトに対して自分の権限をロールバックしなければならなかったので、私は同じコードでサイト全体に対して書いたほぼすべてのビューを詰まらせたくないので、ミドルウェアは良いと思ったこれについてのアイデアはありますが、私はそれをどうやってやるかについてはわかりません。

答えて

8

はい、可能です。 DEF process一(自己、リクエスト)

要求のHttpRequestオブジェクトである

:ジャンゴmiddleware docs for process_requestがあることを示します。このメソッドは、Djangoがどのビューを実行するかを決定する前に、各要求に対して呼び出されます。

process_request()は、NoneまたはHttpResponseオブジェクトのいずれかを返す必要があります。 Noneを返すと、Djangoはこのリクエストの処理を続け、他のミドルウェアを実行してから適切なビューを実行します。 HttpResponseオブジェクトを返すと、Djangoは他のリクエスト、ビューまたは例外ミドルウェア、または適切なビューを呼び出すことはありません。そのHttpResponseを返します。

HttpRequestオブジェクトには、要求されたURLを示すpath属性があります。

しかし、認証バックエンドのためにDjangoのシステムを拡張して、任意の基準(例えば、手書き権限スキームなど)に基づいて権限を要求に入れられるようにすることもできます。この方法で、デフォルトの認証デコレータ(@permission_required@user_passes_test)を活用できます。他のapps/adminサイトもあなたの権限を尊重することができます。作成されたUserオブジェクトと権限は、Djangoのユーザ/権限テーブルに存在する必要はなく、ログイン時に仮想的に作成することができます。私はこれでかなりの成功を収めました。

この訴えがある場合は、Writing an authentication backendを参照してください。

0

あなたはミドルウェアで、許可(許可システム)を実装する場合、次の2つのオプションとなってしまいます。

  1. チェックURLと
  2. チェックURLにアクセスした場合はアクセス

を拒否することができますあなたの要件は非常にシンプルですが、それはあなたがビューをタッチする必要はないので、それは大丈夫です。

しかし、一般的には、パーミッション・システムは、例えば、それよりもはるかに複雑です:

  1. ユーザーはFOO/SHOW_ALLにアクセスすることができます/
  2. しかし、彼は見たり、アクセスfooのインスタンスができない、すなわち、FOO /ショー/ FOO_1/
  3. 彼はFOO_1インスタンスにアクセスすることはできません、ので、我々は(すべてのFooインスタンス)SHOW_ALL に表示してはならない

私はwritin示唆して3上に実装したい場合gあなた自身の認可バックエンド、これはDJangoと協力して幸せです。いくつかの方法(特定のロジック)を実装し、バックエンドとして接続するだけです。

読み取り:http://docs.djangoproject.com/en/dev/topics/auth/#handling-authorization-in-custom-backends