delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

Djangoのパーミッション機能を使ってアクセス制限をかけてみる

前々回前回に引き続きDjangoパーミッションについて勉強する。

今回はDjangoパーミッション機能を使ってアクセス制限をかけてみる。

公式ドキュメントは以下
docs.djangoproject.com

やること

「view_question」のパーミッションを持っていないユーザーの場合は、http://127.0.0.1:8000/polls/にアクセスした時に403を返すようにする。

実装方法

関数ベースViewの場合は以下のように書く。
※ クラスベースの場合は「PermissionRequiredMixin」を使うが特に難しくないので割愛。

from django.contrib.auth.decorators import login_required, permission_required
from django.http import HttpResponse


@login_required
@permission_required("polls.view_question", raise_exception=True)
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

ポイント

「permission_required」デコレーターの第一引数は「${django_content_type.app_label}.${auth_permission.codename}」と書く。

django_content_typeはapp_labelとmodelで複合ユニークなので、これだと一意性が担保されない気がするのが気になった。

検証

「view_question」を付与されているユーザーと付与されていないユーザーを用意して、検証する。

・「view_question」を付与されているユーザーの場合
f:id:kamatimaru:20200515003706p:plain

・「view_question」を付与されていないユーザーの場合
f:id:kamatimaru:20200515003844p:plain

アクセス制限をかけることができた。