はじめに
前回の記事では、Django標準の/admin/とは別に、
自分で「商品管理用の管理者画面」を作りました。
今回はその続きとして、自作した管理者画面にだけ Basic認証 をかける方法をまとめます。
- 管理者画面だけパスワードで守りたい
- でも、ちゃんとしたログイン機能(ユーザーモデル作って…)まではいらない
というケースで使える、お手軽なアクセス制限です。
今回は下記のページで作成した管理画面に認証をつけたいと思います。
https://qiita.com/jojo__xxxxx/items/37ffb4d6dc5aabf2de41
Basic認証とは?
Basic認証は、
「このページを開く前に、ユーザー名とパスワードを入力してね」
とブラウザに聞かせるための、シンプルな認証の仕組みです。
- アクセスすると、ブラウザがポップアップを出す
- 正しいユーザー名・パスワードを入れると中に入れる
- 間違えるとアクセスできない
という感じです。
フォームでログインするのとは違って、
ブラウザが標準で用意しているダイアログが出てきます。
なぜ basic_auth_required を使うのか?
この記事では、basic_auth_required というデコレータを使います。
from basicauth.decorators import basic_auth_required
これを使う理由はシンプルで、
「特定のビューにだけ、簡単に・安全に Basic認証を追加したい」
からです。
今回、Basic認証をつけたいのは「管理者画面だけ」です。
商品一覧や商品詳細など、一般ユーザーが見るページには不要です。
もしデコレータを使わないで書くと、
- それぞれのビュー(一覧・新規作成・編集・削除…)の中に
- 毎回同じ「Basic認証のチェック処理」をコピペ
ということになり、面倒+バグの原因になります。
basic_auth_required を使えば、
- 認証が必要なビューだけを
- 1行でラップするだけ
で済むので、とてもスッキリ書くことができます。
商品一覧表示画面に Basic認証を設定する
まずは、すでに作ってある商品一覧ページにだけ Basic認証をかけていきます。
from django.urls import path
from .views import List, Create, Update, Delete, CustomerList, CustomerDetails
from basicauth.decorators import basic_auth_required
app_name = "manage"
urlpatterns = [
# ここだけ Basic認証をかける
path("list/", basic_auth_required(List.as_view()), name="list"),
]
ポイントは下記。
path("list/", basic_auth_required(List.as_view()), name="list"),
- 本来なら
List.as_view()をそのまま渡すところを -
basic_auth_required( ... )で包んでいる
という形にしました。
これで
-
/manage/products/list/にアクセスが来る - まず
basic_auth_requiredが「ユーザー名とパスワードは正しい?」とチェック - OKなら
Listの処理(商品一覧を表示)に進む - NGなら、ブラウザにBasic認証のダイアログを出す
という流れになります。
settings.py にユーザー名とパスワードを設定する
次に、Basic認証で使うユーザー名とパスワードをDjango側に教えてあげます。
# Basic認証用のユーザー名とパスワード
BASICAUTH_USERS = {
"username": "pw",
}
-
"username"の部分が「ログインID」 -
"pw"の部分が「パスワード」
になります。
例えば、こんな感じで複数ユーザーを追加することもできます。
BASICAUTH_USERS = {
"admin": "adminpass",
"staff": "staffpass",
}
注意:
- 実運用では
"username"や"pw"のような簡単すぎる値はNGなので複雑なものが推奨されています。 - GitHubに上げる場合は
.envや環境変数にして、ハードコードしないようにする必要があります。
認証の動作イメージ
ここまで設定すると、動きはこんな感じになります。
- ブラウザで
/manage/products/list/にアクセスする - Basic認証のダイアログがポップアップで表示される
-
settings.pyに書いたユーザー名・パスワードを入力する - 正しければ商品一覧画面が表示される
- 間違えていれば、何度もダイアログが出てアクセスできない
他のURL(例:ECサイトの通常の商品ページ)には何も影響がなく、
管理者用URLだけをピンポイントで制限をかけられるようになりました。
さいごに
今回は、
- Basic認証とは何か
- なぜ
basic_auth_requiredデコレータを使うのか - URLパターンに対して Basic認証をつける方法
-
settings.pyでユーザー名・パスワードを設定する方法
をまとめました。
Django標準adminとは別に作った自作管理画面は、
そのままだと誰でもURLを知っていれば見れてしまうので、
まずは今回のようなBasic認証で最低限のアクセス制限をかけておくと安心だなと感じました。