【Django】認証したユーザー(super, staff, active)の権限でアクセス制限・表示制限を設定する
2020.11.18 /
Webアプリケーションを作成する際、ユーザーの権限によってアクセスできるページやページ内で表示する項目を制限したい場合がありますよね。
例えば管理者だけアクセスできるページの作成や、一般会員とプレミアム会員でアクセスできる内容に差をつけたい場合などです。
このようなアクセス制御をDjangoで作成したWebアプリケーションで実現するなら、デフォルトで用意されている「認証機能」を利用するのが簡単です。
本記事では、Djangoの認証機能を使った、ユーザー毎のアクセス制限を実現してみたいと思います。
Djangoの認証機能については、以下Documentも参考にするといいです。
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をクリックし、対象のユーザーを選択します。
対象ユーザーを選択すると「Change User」画面に移動します。
そこの「Permissions」からActive, Staff , Superuserの権限を付与・削除ができます。
ログインユーザーの情報取得
ログインで認証されたユーザーの各情報は以下に示す属性から取得することが可能です。
属性 | 内容 |
---|---|
id | ユーザーID |
username | ユーザー名 |
password | パスワード(ハッシュ値) |
is_active | アクティブユーザー(True or False) |
is_staff | スタッフユーザー(True or False) |
is_superuser | スーパーユーザー(True or False) |
first_name | 名字 |
last_name | 名前 |
メールアドレス | |
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(リダイレクト先を指定)
上記ではログインしていないユーザーの判別を行い、ログインしていないユーザーに対して指定したページにリダイレクトします。