ここまでの作業で全ての作業にトークンを用いた認証を必須にすることができました.しかしながら,現時点ではトークンがあれば全てのコメントの更新や削除ができてしまいます.更新や削除はそのコメントを投稿したユーザだけに限定する場合がほとんどでしょう.
更新や削除を所有者に限定したい場合はコントローラで簡単に実装できます.具体的には次のとおり,コメントの検索時にユーザIDを指定するだけです.
app/Http/Controllers/CommentController.php (抜粋)
public function update(Request $request, $comment_id)
{
$user = Auth::user();
$comment = Comment::where('user_id', '=', $user->id)
->findOrFail($comment_id);
$comment->title = $request->title;
$comment->body = $request->body;
$comment->save();
return new CommentResource($comment);
}
public function destroy(Request $request, $comment_id)
{
$user = Auth::user();
$comment = Comment::where('user_id', '=', $user->id)
->findOrFail($comment_id);
$comment->delete();
return response()->json();
// return new CommentResource($comment);
}
コメントを更新する実験を行います.(1) では2番目のユーザが所有者になっているコメントを1番目のユーザのトークンを使って更新しようとしています.その結果エラー (Not Found) になりました.(2) では自身のコメントを更新してその処理が成功しました.
C:\Users\Rinsaka>curl -X PUT -d "title=update" -d "body=body update" -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/2/ ⏎ # (1) <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Not Found</title> ...(以下略)... C:\Users\Rinsaka>curl -X PUT -d "title=update" -d "body=body update" -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/1/ ⏎ # (2) {"comment":{"id":1,"title":"update","body":"body update","owner":"A. Sample","updated_at":"2023-12-18T12:12:52.000000Z"}} C:\Users\Rinsaka>
更新後にデータベースを検索すると次の様になりました.最初のコメントが更新され,更新日時も変更されています.一方で2つ目のコメントには変更がありません.
sqlite> SELECT id, user_id, created_at, updated_at, title FROM comments WHERE id < 10; ⏎ id|user_id|created_at|updated_at|title 1|1|2023-10-02 10:10:10|2023-12-18 12:12:52|update 2|2|2023-10-02 10:20:10|2023-10-02 10:20:10|2つ目 3|1|2023-10-02 10:30:10|2023-10-02 10:30:10|<三個目>のコメント 4|1|2023-10-30 00:00:00|2023-11-25 12:29:44|佐々木 直樹 5|2|2023-10-30 00:01:00|2023-11-04 23:59:21|松本 あすか 6|3|2023-10-30 00:02:01|2023-11-24 05:12:28|渡辺 七夏 7|1|2023-10-30 00:03:01|2023-11-15 00:16:14|大垣 和也 8|2|2023-10-30 00:04:02|2023-11-13 17:01:10|石田 太一 9|3|2023-10-30 00:05:02|2023-11-24 20:30:59|鈴木 英樹 sqlite>
次に削除の実験を行います.(3) ではやはり自身が所有者ではないコメントを削除しようとして失敗しています.(4) では自身が所有者であるコメント (id=1) を削除しました.
C:\Users\Rinsaka>curl -X DELETE -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/2/ ⏎ # (3) <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Not Found</title> ...(以下略)... C:\Users\Rinsaka>curl -X DELETE -H "Authorization: Bearer 1|fzYV0EEfaDBGy5sifY9V3A6LWZBPmZklpWy4Auxd018912e0" http://192.168.56.101:8000/api/comments/1/ ⏎ # (4) [] C:\Users\Rinsaka>
削除後にデータベースを検索します.ID が 1 であるコメントが削除されていることが確認できました.
sqlite> SELECT id, user_id, created_at, updated_at, title FROM comments WHERE id < 10; ⏎
id|user_id|created_at|updated_at|title
2|2|2023-10-02 10:20:10|2023-10-02 10:20:10|2つ目
3|1|2023-10-02 10:30:10|2023-10-02 10:30:10|<三個目>のコメント
4|1|2023-10-30 00:00:00|2023-11-25 12:29:44|佐々木 直樹
5|2|2023-10-30 00:01:00|2023-11-04 23:59:21|松本 あすか
6|3|2023-10-30 00:02:01|2023-11-24 05:12:28|渡辺 七夏
7|1|2023-10-30 00:03:01|2023-11-15 00:16:14|大垣 和也
8|2|2023-10-30 00:04:02|2023-11-13 17:01:10|石田 太一
9|3|2023-10-30 00:05:02|2023-11-24 20:30:59|鈴木 英樹
sqlite>