【Django】認証したユーザー(super, staff, active)の権限でアクセス制限・表示制限を設定する

時計 2020.11.18 / 時計

【Django】認証したユーザー(super, staff, active)の権限でアクセス制限・表示制限を設定する

Webアプリケーションを作成する際、ユーザーの権限によってアクセスできるページやページ内で表示する項目を制限したい場合がありますよね。

例えば管理者だけアクセスできるページの作成や、一般会員とプレミアム会員でアクセスできる内容に差をつけたい場合などです。

このようなアクセス制御をDjangoで作成したWebアプリケーションで実現するなら、デフォルトで用意されている「認証機能」を利用するのが簡単です。

本記事では、Djangoの認証機能を使った、ユーザー毎のアクセス制限を実現してみたいと思います。

Djangoの認証機能については、以下Documentも参考にするといいです。

Django Authntication System

Djangoにはその他にユーザーやグループごとにモデルに対する追加、変更、削除の細かいパーミッションを設定し、同じようにアクセス制限を行うことができますが、それに関しては別記事でご紹介します。

またDjangoにはアクセス制限を行う方法はいくつかありますが、今回はデフォルトで用意されている「認証機能」のみについて説明しております。

ログイン認証構造

前述しているようにDjangoには初めから「認証機能」が備わっています。
ログイン認証に使用しているパッケージは以下です。

django.contrib.auth

設定ファイルsettings.pyを見ると、上記パッケージが使用できるように初めからINSTALLED_APPSに記載されています。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

ログイン認証で使用するモデルは以下の3つです。

  • django.contrib.auth.models.User
  • django.contrib.auth.models.Permission
  • django.contrib.auth.models.Group

作成したユーザー情報は上記のUserモデルに保存されています。
「python manage.py createsuperuser」で作成したスーパーユーザーもUserモデルに保存されます。

ユーザーの種類

ユーザーには以下3つの種類があります。

  • スーパーユーザー
  • スタッフユーザー
  • アクティブユーザー

それぞれのユーザーで権限が異なります。

スーパーユーザーはすべての権限が与えられます。
そのため全てのユーザーにこの権限を与えるのではなく、管理者の数名のみに与えるべき権限です。

スタッフユーザーは管理画面にログインできるようになります。
Webアプリケーションでは、エンドユーザーにはこの権限は与えずにWebアプリケーションを運営しているスタッフにこの権限を与えるなどします。

アクティブユーザーはDjangoで作成したWebアプリケーションのユーザーとして認識させるかの判別をします。
例えば退職したスタッフや、退会した顧客はアクティブユーザーを外して、ログインができなくするなどします。

これら3つのユーザー権限を利用して、ページのアクセス制御や表示制御を行っていきます。

ユーザー権限の設定方法

ユーザーの権限(スーパー、スタッフ、アクティブ)の設定は、管理画面から行います。

管理画面のトップからUsersをクリックし、対象のユーザーを選択します。

Django:管理画面からUsersを選択する

対象ユーザーを選択すると「Change User」画面に移動します。
そこの「Permissions」からActive, Staff , Superuserの権限を付与・削除ができます。

Django:管理画面からユーザー権限を設定する

ログインユーザーの情報取得

ログインで認証されたユーザーの各情報は以下に示す属性から取得することが可能です。

属性 内容
id ユーザーID
username ユーザー名
password パスワード(ハッシュ値)
is_active アクティブユーザー(True or False)
is_staff スタッフユーザー(True or False)
is_superuser スーパーユーザー(True or False)
first_name 名字
last_name 名前
email メールアドレス
last_login 最終ログイン時間
data_joined 登録日

認証したユーザーに対して、属性を末尾につけることで該当する情報を取得できます。

# views.py

def user_information(request):
    print(request.user.username)
    # test
    print(request.user.email)
    # test@yahoo.co.jp
    print(request.user.is_active)
    # True
    print(request.user.is_staff)
    # False
    print(request.user.is_superuser)
    # False

表示制限

ログインしているかの判定

テンプレート内でそもそもユーザーがログインしているかどうか判定するには、is_authenticated属性を使います。

{% if user.is_authenticated %}
ログインしている場合に表示したい内容を記載
{% endif %}

上記の方法でログインしていないユーザーには特定の項目、例えば会員のみ閲覧できる情報を表示しない、といった対応が取れるようになります。

テンプレート内でユーザー権限ごとに表示制限をする

テンプレート内(htmlファイル)でユーザー権限によって表示する、表示しないと制御することができます。

{% if user.is_superuser %}
<ul>
<li><a href="" class=" ">Admin Site</a></li>
</ul>
{% endif %}

上記では、<ul>文をログインユーザーがスーパーユーザーのときのみ表示します。

アクセス制限

view内でユーザー権限による判定をする

request.user.is_superuserなどでユーザー権限を確認し、if文で判定することでアクセス制限を実現します。

if not request.user.is_superuser:
    return redirect(リダイレクト先を指定)

上記ではユーザー権限がスーパーユーザーでなければ、指定先にリダイレクトします。
このように権限によって、ページにアクセスできなくすることができます。

その他にis_authenticated属性を使えば、ログインユーザーのみのアクセス制限も可能です。

if not request.user.is_authenticated:
    return redirect(リダイレクト先を指定)

上記ではログインしていないユーザーの判別を行い、ログインしていないユーザーに対して指定したページにリダイレクトします。