【初級編】4ステップ!Djangoでログイン機能を実現

プログラミング
Masa
Masa

こんにちは!Masaです。

今回はDjangoで1番簡単だと思う認証機能の解説をしていきます!

この記事をお勧めする人
  • Djangoで認証機能を考えている人(超簡単な)
  • Djangoを勉強している人
  • 認証について軽く知りたい人

認証とは

まず認証について簡単に説明します。

認証とは”相手が名乗った通りの人物であるかを何らかの形で確かめる本人確認”のことを指します。
皆さんがSNSやSaaSを利用するときにサービスにログイン(パスワードや指紋認証)すると思いますが、これはログインする人物が本当に本人かどうか確かめている点で認証です。

認証と似たような言葉で”認可”があります。
認可は”認証済みのアカウントに対して権限を許可すること”を指します。
例えば、管理者アカウントや一般アカウントに振り分けることなどです。

認証方式には多くの種類があり、代表的なものが以下になります。

代表的な認証方式
  • パスワード認証
    • PINコード
    • ワンタイムパスワード
    • 秘密の質問
  • CAPTCHA認証
    • ゆがんだ文字列を入力させる認証です
  • 生体認証
    • 指紋、顔、声、静脈など
  • シングルサインオン:SSO

認証で効果的なのは、上記の認証方式を2つ以上組み合わせることです。

よくあるのが、ユーザIDとパスワードを入力したあと、メールやSMSでワンタイムパスワードが送られてくるケールです
これは、パスワード認証を2つ組み合わせているケースになります。

今回はDjangoの機能による、ユーザIDとパスワードによる認証を実装していきたいと思います。
1番シンプルな方法のため簡単ですが、セキュリティー的には最低限の仕様です。

Django認証の実装

今回は各自がWebアプリを作成できていることを前提とします。

この記事では、在庫管理システムへの認証を実装していきます。

urls.pyへの追記

まず最初にパスの設定を行います。
各自のアプリケーションによってパスが違うと思いますので、この記事を参考にして各自で対応してください。

この記事ではプロジェクト名を”inventory_control”、アプリケーション名を”book_management”としています。

プロジェクトフォルダのurls.pyは変更の必要がありません。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('book_management.urls')),

アプリケーションフォルダ内のurls.pyに追記を行います。

from django.urls import path

from . import views
from django.contrib.auth import views as auth_views # 認証ビュー

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),

    path("login/", auth_views.LoginView.as_view(template_name="book_management/login.html"), name="login"), # ログイン時のビュー
    path("logout/", auth_views.LogoutView.as_view(), name="logout"), # ログアウト時のビュー
]

ここでログイン時とログアウト時のビューを指定し、テンプレートの名前も指定することで、views.pyへの記述をなくしています

今回使用しているログイン時とログアウト時のビューは、Djangoの機能の1つです。

settings.pyへの追記

次にログイン時、ログイン後、ログアウト時に飛ぶページをsettings.pyで指定します。
settings.pyの末尾に記述してください。

LOGIN_URL = 'login/'       # ログイン時
LOGIN_REDIRECT_URL = '/'   # ログイン後
LOGOUT_REDIRECT_URL = 'login/'  # ログアウト後

これでトップページのurlにアクセスしても、ログインページにリダイレクトされるようパスを設定できました。

ビューへのアクセスにログインを求める

上記でトップページにアクセスした際にログインページにリダイレクトされるパスの設定をしましたが、views.pyの方でログインを求める仕様にしないと意味がありません。

クラスベースビューか関数ベースビューかで記述方法が変わってきますので、両方解説します。
なお、今回の記事ではクラスベースビューでの記述で行っています。

まず、クラスベースビューでの記述の仕方です。

from django.contrib.auth.mixins import LoginRequiredMixin

class IndexView(LoginRequiredMixin, View):
    def get(self, request):
         ・・・・

まず1行目で、LoginRequiredMixinクラスをインポートしましょう。

そしてログイン必須にしたいクラス全てで、LoginRequiredMixinを第1引数にして継承させます。
第1引数にすることが大切で、第2引数以降にするとエラーが起きます。

次に関数ベースビューでの記載方法です。

from django.contrib.auth.decorators import login_required

@login_required
def indexview(request);
     ・・・・・

関数ベースビューでは、1行目でlogin_requiredデコレータをインポートします。
ログイン必須の関数ベースビューには、”@login_required”を先頭に付けます。
これによって、そのビューにはログインなしでアクセスすることができません。

以上がビューでの設定です。

ログイン画面の作成

最後にログイン画面の作成を行いましょう。

{% extends 'book_management/base.html' %}

{% block content %}

<body class="text-center">
    <main class="form-signin w-50 m-auto">
        <form method="POST">
            {% csrf_token %}
            {% if form.errors %}
                <p>ユーザー名またはパスワードが間違っています。もう一度入力してください。</p>
            {% endif %}
            <h1 class="h3 mb-3 fw-normal">サインインをどうぞ</h1>
            
            <div class="form-floating">
                <label>ユーザー名</label>
                <input class="form-control" name="username">
            </div>
            
            <div class="form-floating">
                <label>パスワード</label>
                <input class="form-control" type="password" name="password">
            </div>

            <input class="btn btn-outline-primary my-1" type="submit" value="ログイン">
        </form>
    </main>
</body>

{% endblock %}

こちらは特に難しいことはしていません。
上から読んでいけばだいたい理解できると思います。

これでログイン機能を実装できました。
今回はユーザ登録、ログインを管理者しかできない使用のため、以下のコマンドで管理者を作成しログインしてみましょう。

python manage.py createsuperuser

※設定時、パスワードは表示されていないが打ち込めているので注意が必要です。

まとめ

今回はDjangoにてログイン機能を実装しました。

実際はユーザのモデルを作成する必要などがありますが、管理者がアカウントを管理し、外部からのユーザ登録を行わない簡単なシステムであれば今回のものをベースにしても良いと思います。

今回のポイント
  • urls.pyで認証ビューをインポートすることによって、余計なビューの記述が不要
  • views.pyでの各ビューは、ログインを求める仕様にする必要がある
  • ログインを求める仕様は、関数ベースビューかクラスベースビューかで変わってくる

今後は、ユーザのモデルも作成する本格的な認証も解説していきたいと思います!

コメント

タイトルとURLをコピーしました