Yura YuLife

ITエンジニアの覚え書き。

Djangoで特定のページのみBasic認証をかける

やり方は、以下のページの通りです。

djangosnippets: view by view basic authentication decorator

スニペットの保存

まず、上記サイトのスニペットをコピー&ペーストして、プロジェクト内に保存します。

basic_auth_view.py

import base64

from django.http import HttpResponse
from django.contrib.auth import authenticate, login

#############################################################################
#
def view_or_basicauth(view, request, test_func, realm = "", *args, **kwargs):

(中略)

    def view_decorator(func):
        def wrapper(request, *args, **kwargs):
            return view_or_basicauth(func, request,
                                     lambda u: u.has_perm(perm),
                                     realm, *args, **kwargs)
        return wrapper
    return view_decorator

ビュー内で呼び出し

上記手順で保存したファイルから利用する関数をimportし、ビューのデコレータとして記述します。

views.py

from basic_auth_view import logged_in_or_basicauth

# ログインもしくはBasic認証で閲覧できるビュー
@logged_in_or_basicauth()
def some_view(request):
   ...
   return render( ... )

Apache2の設定に追記

WSGIモジュールでBasic認証を利用可能にするため、Apache2のサイトのconfファイルに以下の内容を追記します。

WSGIPassAuthorization On

実際に試してみる

ブラウザからBasic認証を追加したURLへアクセスすると、未ログインの場合はBasic認証のダイアログが表示され、ログイン済みの場合はページが表示されます。

f:id:yurayur:20150331233357p:plain