Django認可入門|カスタムパーミッション(Meta.permissions)の定義方法を初心者向けにやさしく解説
生徒
「Djangoでログインした人によって、できることを変える仕組みってあるんですか?」
先生
「あります。Djangoには認可という仕組みがあって、誰が何をしていいかを細かく決められます。」
生徒
「管理者だけ編集できる、とかですか?」
先生
「そうです。さらに自分でカスタムパーミッションを作ることもできます。」
生徒
「プログラミング未経験でも理解できますか?」
先生
「大丈夫です。パソコンに触ったことがない人でも分かるように、たとえ話を交えて説明します。」
1. Djangoの「認可」とは何か?
Djangoの認可とは、「この人はこの操作をしてもいい」「この人はダメ」という権限の管理のことです。例えば、学校で考えると、先生だけが成績を変更できて、生徒は見るだけ、というルールがありますよね。このルール作りが認可です。
Djangoでは、ログインしているユーザーに対してパーミッション(permission)という許可証を持たせることで、操作できる内容を制限します。
2. Djangoの標準パーミッションの仕組み
Djangoでは、モデル(データの設計図)を作ると、自動で基本的なパーミッションが用意されます。例えば「追加する」「変更する」「削除する」「見る」といった許可です。
これは、アプリに最初から用意されている便利な機能ですが、「承認する」「公開する」など、アプリ独自の動きには対応できません。そこで使うのがカスタムパーミッションです。
3. カスタムパーミッションとは?
カスタムパーミッションとは、自分で自由に作れるオリジナルの許可ルールです。たとえば「記事を公開できる人」「特別なボタンを押せる人」などを決められます。
現実世界でたとえると、「職員室に入っていい人だけが持っているカギ」を自分で作るようなイメージです。
4. Meta.permissionsで定義する基本構文
Djangoでカスタムパーミッションを作るには、モデルの中にあるMetaクラスを使います。Metaとは「このモデルに関する追加情報を書く場所」です。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
class Meta:
permissions = [
("can_publish_article", "記事を公開できる"),
]
ここでは「can_publish_article」というパーミッションを作っています。前半はプログラム用の名前、後半は人が見る説明文です。
5. permissionsの書き方をやさしく分解
permissionsはリスト形式で書きます。中には「タプル」という2つセットの箱を入れます。1つ目が機械向けの名前、2つ目が人向けの説明です。
たとえば、お店の会員カードに「VIP」と書いてあり、裏に「特別席が使えます」と説明があるようなものです。
class Meta:
permissions = [
("can_view_secret", "秘密のページを見られる"),
("can_edit_secret", "秘密の内容を編集できる"),
]
このように、複数のカスタムパーミッションも作れます。
6. マイグレーションでパーミッションを登録する
モデルを書いただけでは、まだDjangoに反映されていません。ここでマイグレーションという作業が必要です。これは「設計図を元に、実際のデータベースを更新する作業」です。
python manage.py makemigrations
python manage.py migrate
これで、カスタムパーミッションがDjangoに正式登録されます。
7. 管理画面でパーミッションを確認する
Djangoの管理画面では、作成したカスタムパーミッションを確認できます。ユーザーやグループにチェックを入れるだけで、許可を与えられます。
これは、紙の申請書にハンコを押すような感覚です。コードを書かなくても設定できるのが初心者にとって安心なポイントです。
8. ビューでカスタムパーミッションを使う例
最後に、作ったパーミッションを使って「許可がある人だけ見られる画面」を作る例です。
from django.contrib.auth.decorators import permission_required
@permission_required("app.can_publish_article")
def publish_view(request):
return HttpResponse("記事を公開できます")
このコードでは、「can_publish_article」の許可を持っていない人は、この画面を開けません。まさに入場制限です。