ここまでの作業でコメントの表示,投稿,編集,削除など基本機能を備えた API を作成することができました.しかしながら,ユーザの認証を行わない API を世界中に公開し,新規投稿を認め,全てのデータに対して編集や削除などの権限までも与えることは現実的ではありません.API を公開するにあたっては,ユーザの認証を行い,その機能ごとにアクセス権限を与えることが現実的です.例えば,次の典型的な3つのパターンが考えられるでしょう.
典型例 | 表示 | 新規投稿 | 編集・削除 |
---|---|---|---|
1 | 認証なしで全てのデータを閲覧可能 | 認証が必要 | 認証後,自身の投稿のみ可 |
2 | 認証すれば全てのデータを閲覧可能 | 認証が必要 | 認証後,自身の投稿のみ可 |
3 | 自身の投稿データのみ閲覧可能 | 認証が必要 | 認証後,自身の投稿のみ可 |
ここで登録するユーザの情報は次の表のとおりとします.
# | name | password | |
---|---|---|---|
1 | A. Sample | a@sample.com | abc |
2 | B. Sample | b@sample.com | abc |
3 | C. Sample | c@sample.com | abc |
なお,ユーザが自身で Web からユーザ登録を行い,電子メールで認証するなどの機能も必要になるでしょう.これらの機能の実装はこちらを参照してください.以降の作業では上記のいずれの例にも対応できるように進めていきます.まず,テスト用のユーザ情報を users テーブルに登録するために,シーダを作成します.
vagrant@ubuntu2204 CommentAPI $ php artisan make:seeder UsersTableSeeder ⏎
INFO Seeder [database/seeders/UsersTableSeeder.php] created successfully.
vagrant@ubuntu2204 CommentAPI $
database/seeders/UsersTableSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\Models\User;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('users')->delete();
User::create([
'name' => 'A. Sample',
'email' => 'a@sample.com',
'password' => bcrypt('abc'),
'created_at' => '2023-11-03 00:01:01',
'updated_at' => '2023-11-03 00:01:01'
]);
User::create([
'name' => 'B. Sample',
'email' => 'b@sample.com',
'password' => bcrypt('abc'),
'created_at' => '2023-11-03 00:02:01',
'updated_at' => '2023-11-03 00:02:01'
]);
User::create([
'name' => 'C. Sample',
'email' => 'c@sample.com',
'password' => bcrypt('abc'),
'created_at' => '2023-11-03 00:03:01',
'updated_at' => '2023-11-03 00:03:01'
]);
}
}
次に DatabaseSeeder に UsersTableSeeder 記載して,シーダの実行時にユーザ情報も登録される様にします.なお,後のステップでは users テーブルと comments テーブルにリレーションシップを設定し,comments テーブルには外部キーとして users テーブルの user_id を追加します.したがって,参照整合性の観点から CommentsTableSeeder よりも前に UsersTableSeeder を実行しなければならないことに注意してください.
database/seeders/DatabaseSeeder.php
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// \App\Models\User::factory(10)->create();
// \App\Models\User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
$this->call(UsersTableSeeder::class); // この順序に注意
$this->call(CommentsTableSeeder::class);
}
}
データベースを一旦ロールバックして,マイグレーション,シードの実行を順に行います.
vagrant@ubuntu2204 CommentAPI $ php artisan migrate:status ⏎ Migration name ........................................ Batch / Status 2014_10_12_000000_create_users_table ......................... [1] Ran 2014_10_12_100000_create_password_reset_tokens_table ......... [1] Ran 2019_08_19_000000_create_failed_jobs_table ................... [1] Ran 2019_12_14_000001_create_personal_access_tokens_table ........ [1] Ran 2023_12_16_135311_create_comments_table ...................... [1] Ran vagrant@ubuntu2204 CommentAPI $ php artisan migrate:rollback ⏎ INFO Rolling back migrations. 2023_12_16_135311_create_comments_table .................... 10ms DONE 2019_12_14_000001_create_personal_access_tokens_table ....... 9ms DONE 2019_08_19_000000_create_failed_jobs_table .................. 8ms DONE 2014_10_12_100000_create_password_reset_tokens_table ........ 8ms DONE 2014_10_12_000000_create_users_table ........................ 8ms DONE vagrant@ubuntu2204 CommentAPI $ php artisan migrate ⏎ INFO Running migrations. 2014_10_12_000000_create_users_table ....................... 17ms DONE 2014_10_12_100000_create_password_reset_tokens_table ........ 7ms DONE 2019_08_19_000000_create_failed_jobs_table ................. 16ms DONE 2019_12_14_000001_create_personal_access_tokens_table ...... 27ms DONE 2023_12_16_135311_create_comments_table ..................... 8ms DONE vagrant@ubuntu2204 CommentAPI $ php artisan db:seed ⏎ INFO Seeding database. Database\Seeders\UsersTableSeeder ............................ RUNNING Database\Seeders\UsersTableSeeder ........................ 684 ms DONE Database\Seeders\CommentsTableSeeder ......................... RUNNING Database\Seeders\CommentsTableSeeder ..................... 754 ms DONE vagrant@ubuntu2204 CommentAPI $
ユーザの情報が登録されましたが,現時点ではユーザ認証が一切行われていないことも次の手順で確認しておきます.(1) ユーザ情報を与えなくてもコメントを閲覧できます.(2) 正しい認証情報を与えてもコメントを閲覧できます.(3) 不正なパスワードを与えてもコメントを閲覧できる状態です.なお,認証情報は -u
オプションの後に「ユーザ名:パスワード」で指定します.
C:\Users\Rinsaka>curl http://192.168.56.101:8000/api/comments/1/ ⏎ # 認証情報なし {"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}} C:\Users\Rinsaka>curl -u a@sample.com:abc http://192.168.56.101:8000/api/comments/1/ ⏎ # 正しい認証情報 {"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}} C:\Users\Rinsaka>curl -u a@sample.com:xyz http://192.168.56.101:8000/api/comments/1/ ⏎ # 不正なパスワード {"comment":{"id":1,"title":"最初のコメント","body":"最初のコメントです!","updated_at":"2023-10-02T10:10:10.000000Z"}} C:\Users\Rinsaka>