現時点でユーザ認証ができるようになりましたが,ユーザ名を指定しなければ全ての操作ができる状態にありました.ここでは,閲覧だけでなく投稿や更新など全ての操作でユーザ認証を求めるようにします.
Django REST Framework の permissions を利用するとさまざまなアクセスに対して許可や拒否を設定することができます.例えば,次の通り IsAuthenticated
を指定すると,そのクラスの実行時にはユーザ認証を求めることができます.
comments\views.py
from django.shortcuts import render
from rest_framework import generics
from rest_framework import permissions
from .models import Comment
from .serializers import CommentSerializer
from .paginations import LargeResultsSetPagination
# Create your views here.
class CommentList(generics.ListCreateAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
pagination_class = LargeResultsSetPagination
permission_classes = [permissions.IsAuthenticated]
class CommentDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
permission_classes = [permissions.IsAuthenticated]
実際に認証が必要になっているかどうかを GET メソッドについて確認すると,正しいユーザ名とパスワードを与えたときだけ閲覧が許可されていることがわかります.
...\django_comment_api>curl http://127.0.0.1:8000/comments/ ⏎ {"detail":"認証情報が含まれていません。"} ...\django_comment_api>curl http://127.0.0.1:8000/comments/1/ ⏎ {"detail":"認証情報が含まれていません。"} ...\django_comment_api>curl -u user_a:password http://127.0.0.1:8000/comments/ ⏎ {"count":11,"next":"http://127.0.0.1:8000/comments/?page=2","previous":null,"results":[{"id":13,"title":"0123456789","body":"012345678901234","updated_at":"2023-11-23T15:24:38.905335"},{"id":9,"title":"9個目のコメント","body":"コメントの本 文9","updated_at":"2023-11-23T11:20:00"}]} ...\django_comment_api>curl -u user_a:password http://127.0.0.1:8000/comments/1/ ⏎ {"id":1,"title":"最初のコメント","body":"コメントの本文","updated_at":"2023-11-23T11:01:00"} ...\django_comment_api>curl -u user_a:abc http://127.0.0.1:8000/comments/ ⏎ {"detail":"ユーザ名かパスワードが違います。"} ...\django_comment_api>curl -u user_a:abc http://127.0.0.1:8000/comments/1/ ⏎ {"detail":"ユーザ名かパスワードが違います。"} ...\django_comment_api>
次に POST メソッドでも確認すると期待した結果になりました.
...\django_comment_api>curl -X POST -d "title=auth" -d "body=required" http://127.0.0.1:8000/comments/ ⏎ {"detail":"認証情報が含まれていません。"} ...\django_comment_api>curl -X POST -d "title=auth" -d "body=required" -u user_a:password http://127.0.0.1:8000/comments/ ⏎ {"id":14,"title":"auth","body":"required","updated_at":"2023-11-23T16:22:51.508782"} ...\django_comment_api>
さらに Web ブラウザでも表示すると,ログインしていないために期待通りに 403 エラーが表示されました.
上の画面ではログインのメニューが表示されていないので,ログイン操作ができるようにプロジェクトの urls.py に次のブロックを追加します.
django_comment_api\urls.py(抜粋)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path('', include('comments.urls')),
]
# 次のブロックを追加すると,ブラウザで閲覧した時,右上にログインのメニューが現れる
urlpatterns += [
path('api-auth/', include('rest_framework.urls')),
]
もう一度一覧ページを読み込み直すと再び 403 エラーですが,右上に Log in メニューが表示されました.このメニューをクリックします.
美しくデザインされたログインページが表示されました.
ユーザ名とパスワードを入力してログインします.
無事に一覧ページを閲覧できました.
もちろん詳細表示も可能です.
ログインすることで,一覧表示や個別表示ができるようなりました.次のページではコメントを誰が投稿したのか,その情報を管理できるようにします.