Laravel 10 入門トップページ


目次

  1. 全体の概要
  2. Laravel によるユーザ認証
    1. 概要
    2. プロジェクトの作成と初期設定
    3. メールの設定
    4. Laravel Breeze のインストール
    5. ユーザ登録機能の動作確認
    6. シーダによるテストユーザの登録
    7. テーブルにログイン ID の属性を追加
    8. ユーザ登録機能の修正
    9. ログイン ID でログインするように変更
    10. メールアドレスの検証
    11. シーダの修正
    12. 検証メールの有効期限と再送信
    13. セッション継続時間の確認と変更
    14. メールアドレスの変更
    15. パスワードの変更
    16. アカウントの削除
  3. ユーザ認証を備えたコメント掲示板の開発
  4. マルチ認証の実現

Laravel でユーザ認証とマルチ認証を実現する

Laravel によるユーザ認証

シーダによるテストユーザの登録

ここでは,動作検証用に次の3名のテストユーザ ID をシーダを使って登録します.

# name e-mail login_id password
1 A. Sample a@sample.com user_a abc
2 B. Sample b@sample.com user_b abc
3 C. Sample c@sample.com user_c abc

まず,次のコマンドでシーダの雛形を生成します.

vagrant@ubuntu2204 laravelAuth $ php artisan make:seeder UsersTableSeeder ⏎

   INFO  Seeder [database/seeders/UsersTableSeeder.php] created successfully.

vagrant@ubuntu2204 laravelAuth $

生成された雛形は次のようになっているはずです.

database/seeders/UsersTableSeeder.php<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        //
    }
}

このファイルを編集して,3名のデータを設定します.

database/seeders/UsersTableSeeder.php<?php

namespace Database\Seeders;

use Illuminate\Support\Facades\DB;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

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 を編集します.

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);
    }
}

次のコマンドでデータベースにシードを投入します.

vagrant@ubuntu2204 laravelAuth $ php artisan db:seed ⏎

   INFO  Seeding database.

  Database\Seeders\UsersTableSeeder .......................................... RUNNING
  Database\Seeders\UsersTableSeeder ................................... 644.56 ms DONE

vagrant@ubuntu2204 laravelAuth $

なお,システムの開発中には何度もデータベースを再構成(ロールバックとマイグレーション)してテストデータを入れ直すことを行います.慣れないうちはマイグレーションの状況も確認しながら次の手順で行うと良いでしょう.

vagrant@ubuntu2204 laravelAuth $ 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

vagrant@ubuntu2204 laravelAuth $ php artisan migrate:rollback ⏎

   INFO  Rolling back migrations.

  2019_12_14_000001_create_personal_access_tokens_table .... 12ms DONE
  2019_08_19_000000_create_failed_jobs_table ................ 5ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ...... 5ms DONE
  2014_10_12_000000_create_users_table ...................... 6ms DONE

vagrant@ubuntu2204 laravelAuth $ php artisan migrate:status ⏎

  Migration name ...................................... Batch / Status
  2014_10_12_000000_create_users_table ....................... Pending
  2014_10_12_100000_create_password_reset_tokens_table ....... Pending
  2019_08_19_000000_create_failed_jobs_table ................. Pending
  2019_12_14_000001_create_personal_access_tokens_table ...... Pending

vagrant@ubuntu2204 laravelAuth $ php artisan migrate ⏎

   INFO  Running migrations.

  2014_10_12_000000_create_users_table ..................... 18ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ...... 4ms DONE
  2019_08_19_000000_create_failed_jobs_table ................ 8ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .... 11ms DONE

vagrant@ubuntu2204 laravelAuth $ 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

vagrant@ubuntu2204 laravelAuth $ php artisan db:seed ⏎

   INFO  Seeding database.

  Database\Seeders\UsersTableSeeder .......................... RUNNING
  Database\Seeders\UsersTableSeeder ................... 647.57 ms DONE

vagrant@ubuntu2204 laravelAuth $

複数のコマンドをセミコロンで区切ると,一気に実行することができます.

vagrant@ubuntu2204 laravelAuth $ php artisan migrate:rollback; php artisan migrate; php artisan db:seed ⏎

   INFO  Rolling back migrations.

  2019_12_14_000001_create_personal_access_tokens_table .... 14ms DONE
  2019_08_19_000000_create_failed_jobs_table ................ 4ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ...... 5ms DONE
  2014_10_12_000000_create_users_table ...................... 4ms DONE


   INFO  Running migrations.

  2014_10_12_000000_create_users_table ..................... 10ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ...... 4ms DONE
  2019_08_19_000000_create_failed_jobs_table ................ 8ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .... 12ms DONE


   INFO  Seeding database.

  Database\Seeders\UsersTableSeeder .......................... RUNNING
  Database\Seeders\UsersTableSeeder ................... 640.57 ms DONE

vagrant@ubuntu2204 laravelAuth $

SQLite を操作してデータベースのテーブルに正しくデータが投入されているか確認します.なお,パスワードが平文ではなくハッシュ化されて保存されていることに注意してください.また,パスワードに「ソルト(塩)」を含めてハッシュ化しているため,3名が全く同じパスワード「abc」を設定していますが,異なるハッシュ化パスワードが保存されていることにも注意してください.

vagrant@ubuntu2204 database $ sqlite3 database.sqlite ⏎
SQLite version 3.38.2 2022-03-26 13:51:10
Enter ".help" for usage hints.
sqlite> .tables ⏎
failed_jobs             password_reset_tokens   users
migrations              personal_access_tokens
sqlite> .headers on ⏎
sqlite> select * from users; ⏎
id|name|email|email_verified_at|password|remember_token|created_at|updated_at
1|A. Sample|a@sample.com||$2y$12$FATUTvzG/WZ2XSTEF7mZsOAvm5SOyHY7xlG0.Fmj9JEDicVo1XwFe||2023-11-03 00:01:01|2023-11-03 00:01:01
2|B. Sample|b@sample.com||$2y$12$jWy5lXbC/niY8Tz1ICQ9TeNZHLekrTfj9gQGVgLZHARWRrybWEbye||2023-11-03 00:02:01|2023-11-03 00:02:01
3|C. Sample|c@sample.com||$2y$12$uKNjpsikh3MZcDJz4ZQTm.MdOzAgHiO5qtS21BFmWiYZomARNISK2||2023-11-03 00:03:01|2023-11-03 00:03:01
sqlite>

Webサーバを起動して,シードで投入したメールアドレスとパスワードを使ってログインしてみます.

laravel10-2023-auth-10.png

ログインに成功してダッシュボードが表示されました.

laravel10-2023-auth-11.png

ここまでの作業で,メールアドレスとパスワードでログインができるようになりました.次のページではメールアドレスの代わりにログイン ID でログインできるようにするために,データベースのテーブルに属性(列)を追加します.

目次に戻る