Laravelで自作の認証を作成する

Laravelで自作の認証を作成する

Laravelデフォルトのusersプロバイダーではなく、自作で認証機構を作成する方法をまとめる。

環境

  • PHPのバージョン
    • 8.1.27
  • Laravelのバージョン
    • v9.52.16

参照ドキュメント

Laravelでの認証方法の概要

Laravelで認証機構を自作する場合は自作のユーザープロパイダーを作成する必要がある。 また、そのユーザープロバイダーの一部のメソッドで返すクラスはAuthenticatableインタフェースを実装する必要がある。 ユーザープロバイダーを作成したら、認証で使用しているガードにそのプロバイダーを設定する。

自作で認証機構を作る方法

大まかな手順は以下の通り。

  1. Authenticatableインタフェースを実装した認証済ユーザーの情報を持つクラスを作成する
  2. 自作のユーザープロバイダーを作成する
  3. サービスプロバイダーに自作のユーザープロバイダーを登録する
  4. 認証で使用しているガードに作成したユーザープロバイダーを設定する

作成手順

Authenticatableを実装したクラスを作成する

Illuminate\Contracts\Auth\Authenticatableインタフェースを実装したクラスを作成する。 implementsするには以下のメソッドの実装が必要。 具体的な実装例はEloquentモデルのUserクラスなどを参考にするとよい。

  • getAuthIdentifierName
    • ユーザをユニークに識別できるIDのキー名を返す
    • RDBMSなどではテーブルのカラム名にだいたいはなる
  • getAuthIdentifier
    • ユーザのIDの値を返す
  • getAuthPassword
    • ユーザのパスワードを返す
  • getRememberToken
    • remember tokenの値を返す
  • setRememberToken
    • remember tokenを設定する
  • getRememberTokenName

自作のユーザープロバイダーを作成する

Illuminate\Contracts\Auth\UserProviderインタフェースを実装した自作のユーザープロバイダーを作成する。 既存のEloquentUserProviderクラスなどを参考に実装する。実装が必要なメソッドは以下。

  • retrieveById($identifier);
    • IDから該当するユーザを取得する
    • 返すクラスは先程実装したAuthenticatableを実装した自作ユーザクラスを返す
  • retrieveByToken($identifier, $token);
    • IDとremember me tokenからユーザを取得する
    • こちらも戻り値として自作ユーザクラスを返す
  • updateRememberToken(Authenticatable $user, $token);
    • 自作ユーザクラスとremember me tokenを引数で受け取りremember me tokenを更新する
  • retrieveByCredentials(array $credentials);
    • 引数でemailやパスワードなどの認証情報を受け取り自作ユーザを取得する
    • 戻り値は自作ユーザ
  • validateCredentials(Authenticatable $user, array $credentials);
    • 引数で自作ユーザとログイン時に入力された認証情報を受け取り合致するか検証し結果を返す

サービスプロバイダーに自作のユーザープロバイダーを登録する

config/auth.phpで自作プロバイダーを使用できるようAuthServiceProviderに設定を追加する。 \Auth::providerメソッドの第一引数にconfig/auth.phpで使用する名前を任意で指定する。 第二引数で自作プロバイダーを生成するメソッドを指定する。

    public function boot()
    {
        $this->registerPolicies();

        //カスタムプロバイダの名前を定義
        \Auth::provider(
            // config/auth.php には、この名称で設定を行う。
            'my_user',
            function ($app, array $config) {
                // MyUserProviderは自作プロバイダー
                return new MyUserProvider($app['hash']);
            }
        );
    }

認証で使用しているガードに作成したユーザープロバイダーを設定する

作成したユーザープロバイダーを使用するためconfig/auth.phpの設定を変更する。 現在使用しているガードが使用しているユーザープロバイダーを自作したユーザープロバイダーに変更する。

例えばデフォルトで使用しているガードが以下のwebガードで使用しているproviderusersの場合、

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    ],

providers.usersに以下のように自作ユーザープロバイダーを設定する。ここで設定する値が先程AuthServiceProviderで設定した文字列になる。

    'providers' => [
        'users' => [
            'driver' => 'my_user',
        ],
    ],

おわり

以上で自作ユーザープロバイダーと自作ユーザーを使用した認証の作成は完了。 Auth::user()メソッドやテスト時のTestCase::actingAsメソッドなどで自作のAuthenticatableを実装したユーザクラスが使用できるようになる。