【Laravel11 認証機能】Adminユーザの作成 1. データベース管理設定

Laravel 認証機能 – 管理者権限の導入

以前、Laravel 11でユーザ登録、ログイン機能を自作する方法を実装を解説してきましたが、ここからはアプリケーションに通常ユーザとは異なる権限を持つ「管理者ユーザ」を作成、管理できる仕組みを導入する方法について複数記事にわたって解説していきます。

前回投稿した一連の記事 – Laravel 11で認証機能を0から自作する –
【Part.1 – 共通レイアウト、トップページ & ダッシュボードの作成】

【Part.2 – ユーザー登録機能の実装】

【Part.3 ログイン機能】

管理者権限を導入する仕組みとしては、通常ユーザを管理するusersテーブルに権限用のカラムを追加する方法もありますが、今回は管理者ユーザ用に、通常ユーザとは異なる専用のテーブルを用意する方法で管理者権限の仕組みを導入します。

環境: Laravel 11, PHP 8.3.14

Laravel 認証機能 – 管理者ユーザ用のDBテーブルを作成する

管理者用(Admin)ユーザ機能の実現にあたり、データベースの設定を行っていきます。

adminsテーブルの作成

管理者用ユーザを管理するadminsテーブルを作成します。

Laravel開発環境で以下のartisanコマンドを実行し、マイグレーションファイルを生成します。

php artisan make:migration create_admins_table

生成されたマイグレーションファイルを編集して、管理者テーブルの構造を定義します。

database/migrations/xxxx_xx_xx_xxxxxx_create_admins_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('admins');
    }
};

マイグレーションを実行してテーブルを作成します。
php artisan migrate

管理者ユーザ(Admin)モデルの作成

次に、管理者ユーザーを操作するための Eloquent モデルを作成します。

php artisan make:model Admin

app/Models/Admin.php

生成された状態から以下のように編集します。

Laravelの認証用モデルとして機能させるため、App\Models\Userと同様にAuthenticatableを継承させます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable
{
    use HasFactory;
    
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];
}

管理者ユーザの登録

以前、こちらの母体となる認証機能の中にユーザ登録機能を作成していますが、以下の理由からadminsテーブルへはそちらの機能を使って登録できないものとします。

  • セキュリティの確保: 管理者ユーザーは高い権限を持つため、一般の利用者からブラウザを使って自由に登録できるとセキュリティリスクが高まります。
  • 登録頻度の低さ: 管理者ユーザーの追加は頻繁に行われるものではなく、特別な手順で登録するのが一般的です。
  • 運用の分離: 通常のユーザー操作と、システム管理者の操作を分離することで、システム設計が明確になります。

管理者ユーザーをアプリケーション以外から登録するために、データベースへ直接ログインしてSQLによるインサートを行っても良いですが、せっかくですのでLaravelの機能を活用していきます。

1.Seederを使ってデータ投入する

ひとつ目はシーディングという手法で、シーダークラスに記載されたデータをseedrコマンドを実行してDBに投入する方法で、テストデータの内容をソースコードで管理できるので、テストデータの作成に適しています。

コマンドを実行し、Admin用のシーダークラスを作成する
php artisan make:seeder AdminSeeder

以下、コマンドで生成されたSeederクラスファイル内に投入する管理者ユーザのデータを記載します。
(投入する値は任意のものに書き換えてください)

database/seeders/AdminSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Admin;

class AdminSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run()
    {
        Admin::create([
            'name' => 'admin',
            'email' => 'admin@example.com',
            'password' => bcrypt('watasiwakanrisha'),
        ]);
    }
}

パスワードとして設定する値をDBへ投入する際は、安全のために、bcrypt関数を使用してハッシュ値化しています。

Seederクラスの作成ができたら以下シーディングコマンドを実行し、DBへのデータ投入と結果を確認します。
php artisan db:seed --class=AdminSeeder

2.Tinkerを実行してデータ投入する

次にLaravelのコマンドラインツール、Tinkerを利用してデータを投入する方法について解説します。

コマンドラインから、以下のコマンドでTinkerを起動します。
php artisan tinker

Tinkerが起動したら、コマンドラインから任意の値を指定してAdmin::createを実行します。

(Tinker起動中にソースコードをそのまま貼り付けて実行すればOK)

Psy Shell v0.12.4 (PHP 8.3.14 — cli) by Justin Hileman
> use App\Models\Admin;
> use Illuminate\Support\Facades\Hash;
> 
> Admin::create([
.     'name' => 'admin',
.     'email' => 'admin@example.com',
.     'password' => Hash::make('watasiwakanrisha'),
. ]);
> 

こちらの内容で、データベース設定と管理者用ユーザのデータ作成が完了したら、次回はガード & プロバイダ設定とミドルウェアの作成を行なっていきます。

Follow me!