特定のユーザーに制限したいビューを持つ小さな Django アプリケーションがあります。特定のネットワークのユーザーは、IP アドレスのみに基づいて、追加の認証なしでそのビューを表示できる必要があります。この IP 範囲外のその他のユーザーには、パスワードを要求し、デフォルトの Django ユーザー管理に対して認証する必要があります。
そのためにはカスタム認証バックエンドを作成する必要があると思いますが、関数がユーザー名とパスワードの組み合わせまたはトークンを期待しているように見えるため、ドキュメントが混乱していますauthenticate()
。ここで IP アドレスを使用して認証する方法がわかりません。
Django で IP アドレスベースの認証を実装する適切な方法は何でしょうか? セキュリティ関連のコードについては、すべてを自分で書くのではなく、既存のライブラリ関数をできるだけ多く使用したいと思います。
ベストアンサー1
この種の認証には 2 つの適切なアプローチがあります。
- デコレーターとして:一部のビュー(ただし、多くはない)でこのチェックが必要な場合は、そのためのデコレータ(@Jingo が書いたようなもの)を記述する方がよいでしょう。
- ミドルウェアとして:もしそのチェックをすべての(または多くの)ビューで実行する必要がある場合、デコレータを使用する代わりに、ミドルウェアより良い解決策です。
サンプルミドルウェアは次のようになります。
ALLOWED_IP_BLOCKS = [......]
class NeedToLoginMiddleware(object):
def process_request(self, request):
ip = request.META['REMOTE_ADDR']
if not ip in ALLOWED_IP_BLOCKS: #ip check
if not request.user.is_authenticated(): #if ip check failed, make authentication check
return HttpResponseRedirect(...)
return None
- @Jingo が述べたように、リストまたは正規表現を使用して IP チェックを行うことができます。
Django認証を使用していてリスト
REMOTE_ADDR
にない場合は、関連するユーザーがログインしているかどうかを確認するためにALLOWED_IP_BLOCKS
使用できます。ただし、カスタムミドルウェアで使用する場合は、カスタムミドルウェアis_authenticated
is_authenticated
の後に置く必要がありますAuthenticationMiddleware
、request.user
そのレベルに設定されているからです。MIDDLEWARE_CLASSES = ( ... 'django.contrib.auth.middleware.AuthenticationMiddleware', 'path.to.my.NeedToLoginMiddleware', ... )
- いくつかのビューでこの認証が必要ない場合は、例外的な URLリクエスト URL を取得し
request.path
、リクエスト URL に IP チェック/認証が必要かどうかを確認します。
- いくつかのビューでこの認証が必要ない場合は、例外的な URLリクエスト URL を取得し
詳細情報カスタムミドルウェアクラス