
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#4:ログイン認証ユーザー作成
前回からの続きでウェブアプリケーションをLaravelを使って作成していきます。今回は実際に必要とされるログイン機能で扱われるデータとそのデータを格納するテーブルを作成していきます。ここからは本格的なウェブアプリケーションの開発が進んでいきます。ここではシンプルなテストデータを例に進めていますが、実際には要件に合わせて実装されていきますのであくまで参考程度としていただければと思います。
(これまでの内容はこちらの記事から)
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#1:Docker環境構築
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#2:Laravelのインストール
Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#3:静的ページの作成とルーティング
Laravelにはデフォルトでユーザー用のテーブルがあり、認証設定もそのテーブル内に保存されるデータが対象となっていますが、今回は新たに認証ユーザー用のテーブルとデータを作成し、認証設定もそれに合わせて更新する前提になっています。実際の開発でも複数の認証ユーザーを作成することがあるので本記事でもそういったケースを想定した内容で進めていきます。
前回に続いてウェブアプリケーションのバックエンド側の開発についてまとめていますが、アプリケーション内でいろんな機能がある中でログイン認証はどのアプリケーションでも実装されている最も基本となるものであると言えます。よく使う機能ですので、コードなどは手元に用意しておくと開発も捗りますね。 (こちらの記事も合わせてどうぞ) Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#1:Docker環境構築 Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#2:Laravelのインストール Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#3:静的ページの作成とルーティング
1. ログイン認証ユーザー用テーブルのマイグレーションファイルを作成
ユーザーデータを格納するテーブルが必要となりますが、Laravelではマイグレーション機能を使ってテーブルを作成していきます。下記コマンドでマイグレーションファイルを新規で作成します。make:migrationコマンドの後にはマイグレーションファイルの名前を入れますが、テーブルの内容や目的がわかるようにしておくと良いですね。コマンドを入力するとタイムスタンプがついたファイル名でマイグレーションファイルが所定のディレクトリ配下に作成されます。$ docker-compose exec app php laravel/artisan make:migration create_admin_users_table上記コマンドでマイグレーションファイルを作成すると自動的にフォーマットが作成されているので、必要に応じてコードを編集していきます。ファイル内ではユーザーに必要な情報を格納するカラムを作成します。ここではキーとなるIDに加えて、メールアドレスとパスワード、ユーザー名を文字列として、さらに「timestamps()」を使うことで自動的に「created_at」と「updated_at」のカラム作成とタイムスタンプの値が自動で入るようになります。また削除した際に復元可能とするために「softDeletes()」を使ってソフトデリートに対応させておきます。合わせて、テーブルを削除するための処理も記述しておきます。 【database/migrations/yyyy_mm_dd_******_create_admin_users_table.php】
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('admin_users', function (Blueprint $table) {
$table->id();
$table->string('email')->comment('メールアドレス');
$table->string('password')->comment('パスワード');
$table->string('name')->comment('ユーザー名');
$table->timestamps();
$table->softDeletes();
});
}
public function down()
{
Schema::dropIfExists('admin_users');
}
};
また、必須ではないですが、「comment()」を使うとカラムの説明文を入れることができます。これでマイグレーションのコマンドでデータベースにテーブルとカラムが作成できるようになります。
2. ログイン認証ユーザー用テーブルに対応するModelを作成
マイグレーションでテーブルを作成する処理を書いた後、そのテーブルに対応するModelを作成していきます。こちらも専用のファイルで管理しますので同様に下記コマンドで新規作成します。コマンドを入力するとファイルが所定のディレクトリ配下に作成されます。$ docker-compose exec app php laravel/artisan make:model AdminUsers上記コマンドでモデルファイルを作成すると自動的にフォーマットが作成されているので、必要に応じてコードを編集していきます。一般的なモデルファイルでは、クラスの継承元が「Model」となりますが、今回は認証として使うため下記のように検証元を「Authenticatable」に変更します。そして「$fillable」の変数には更新対象のカラムを、「$hidden」の変数にはユーザー情報の中でデータ取得の際に不要なものを指定しておきます。 【app/Models/AdminUsers.php】
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
class AdminUsers extends Authenticatable
{
use HasFactory;
protected $fillable = [
'email',
'password',
'name',
];
protected $hidden = [
'password'
];
}
3. 認証機能の設定を変更
Laravelでは認証機能に関する設定を専用のファイルで管理していきます。configディレクトリ配下にある「auth.php」のファイルを更新していきます。「defaults」ではデフォルトの認証設定を、「guards」では認証ガードを定義します。「providers」で認証方法の設定を行い、「passwords」ではパスワードリセットに関する設定を行います。デフォルトのコードを必要に応じて下記のように編集していきます。 【config/auth.php】※一部抜粋.....
'defaults' => [
'guard' => 'web',
'passwords' => 'admin_users', /* 認証ユーザー用のテーブルを指定 */
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'admin_users', /* 認証ユーザー用のテーブルを指定 */
],
],
'providers' => [
'admin_users' => [
'driver' => 'eloquent',
'model' => App\Models\AdminUsers::class, /* 認証ユーザー用のモデルを指定 */
],
],
'passwords' => [
'admin_users' => [
'provider' => 'admin_users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
.....
4. テストユーザー用のシーダーファイルを作成
最初にテーブルを作成した段階では、何もデータが入っていない状態になります。そこでテスト用のデータが必要になりますが、Laravelではシーダー機能を使うことで、テスト用のデータを簡単に用意することができます。こちらも先ほど同様に専用のコマンドが用意されていますので、下記コマンドでシーダー用のファイルを作成していきます。コマンドを入力するとファイルが所定のディレクトリ配下に作成されます。$ docker-compose exec app php laravel/artisan make:seeder AdminUsersSeeder上記コマンドでシーダーファイルを作成すると自動的にフォーマットが作成されているので、必要に応じてコードを編集していきます。先ほど作成したログインユーザー用のモデルを紐づけて、テーブルの各カラムに対応した値を「create()」メソッドで入れていきます。パスワードについては「bcrypt()」を使うことでパスワードをハッシュ化して保存することができます。もちろん、複数のユーザーを登録することも可能です。 【database/seeders/AdminUsersSeeder.php】
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\AdminUsers;
class AdminUsersSeeder extends Seeder
{
public function run()
{
$admin_user = AdminUsers::create([
'email' => 'test@example.com',
'password' => bcrypt('password'),
'name' => 'サンプルユーザー',
]);
}
}
上記の新規で作成したシーダーファイルはデフォルトで用意されている「DatabaseSeeder.php」の方で呼び出す形にしておくと、管理が楽になります。シーダーファイルは個別に実行し、特定の情報だけ登録することも可能ですが、一括で更新する場合にはこのような方法が便利です。
【database/seeders/DatabaseSeeder.php】
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call([
AdminUsersSeeder::class,
]);
}
}
これでログインユーザー用のテーブルとテストデータ作成の準備が整いました。あとはマイグレーションとシーダーのコマンドを実行するとデータベースに値が入っていきます。コマンドは以前に作成しておいたMakeコマンド(参考記事:Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#2:Laravelのインストール https://designsupply-web.com/media/development/7434)を使って一括で実行していきます。
$ make fresh Creating migration table.... Running migrations.... Seeding database....データベースにテーブルとカラムが作成されて、その中にシーダーファイルで定義した値が入っていきました。実際にデータベースにアクセスして確認してみますと、実際に情報が格納されているのが確認できます。
$ make db MariaDB [(none)]> use laravel_local; MariaDB [laravel_local]> SELECT * FROM admin_users; | id | email | password | name | created_at | updated_at | deleted_at | | 1 | test@example.com | $2y$10$... | サンプルユーザー | 2023-01-07 19:06:59 | 2023-01-07 19:06:59 | NULL |これでログインユーザーのテーブルとデータが準備できました、この後は実際にログイン認証機能を実装して、実際にログインを行なっていく形になります。
前回に続いてウェブアプリケーションのバックエンド側の開発についてまとめていますが、アプリケーション内でいろんな機能がある中でログイン認証はどのアプリケーションでも実装されている最も基本となるものであると言えます。よく使う機能ですので、コードなどは手元に用意しておくと開発も捗りますね。 (こちらの記事も合わせてどうぞ) Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#1:Docker環境構築 Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#2:Laravelのインストール Docker+Laravelでバックエンドの開発環境構築とウェブアプリケーション制作#3:静的ページの作成とルーティング