laravel8 jetstreamのfortifyを使ってmulti authログインを実現する。

php/laravel

laravel8でログイン機能がアップデート

laravelに初期機能で実装されているログイン機能が、laravel/uiからlaravel/jetstreamに変更になりました。
こちら多機能ですが、カスタマイズの煩雑差から導入の嫌煙をされている人も多いですが、今後非推奨となるlaravel/uiを使うのもナンセンスなのでこちらを使ってがんばってマルチログインを実装したいと思います。

jetstreamのインストール

下記のコマンドでlaravel8とjetstreamをインストールします。

composer create-project --prefer-dist "laravel/laravel=8.*" .

まずはコンポーザーでjetstreamをインストール
composer require laravel/jetstream

livewireかinertiaを選択
php artisan jetstream:install livewire --teams
php artisan jetstream:install inertia

npm install && npm run dev

nodejsがインストールされていない場合は下記コマンドでnodejsもインストールしてください。

apt-get update
apt-get -y install nodejs npm

jetstreamをインストストールを完了した地点でログイン機能が追加されているはずです。userテーブルも追加されているので、userテーブルに役割判別の為roleカラムを追加します。(中身はadminやuser等)

この後は下記のサイトを参考に役割によるリダイレクトの記述をします。
https://laracasts.com/discuss/channels/laravel/version-8-redirects

app/Http/Responses 配下に下記のファイルを追加します。
LoginResponse.php

<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function toResponse($request)
    {
        $role = \Auth::user()->role;

        if ($request->wantsJson()) {
            return response()->json(['two_factor' => false]);
        }

        switch ($role) {
            case 'admin':
                return redirect()->intended(config('fortify.home'));
            case 'host':
                return redirect()->intended('/host/dashboard');
            default:
                return redirect('/');
        }
    }
}

app/Http/Responsesフォルダ配下にTwoFactorLoginResponse.phpを追加します。

<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\TwoFactorLoginResponse as TwoFactorLoginResponseContract;

class TwoFactorLoginResponse implements TwoFactorLoginResponseContract
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function toResponse($request)
    {
        $role = \Auth::user()->role;

        if ($request->wantsJson()) {
            return response('', 204);
        }

        switch ($role) {
            case 'admin':
                return redirect()->intended(config('fortify.home'));
            case 'host':
                return redirect()->intended('/host/dashboard');
            default:
                return redirect('/');
        }
    }
}

app\Providers\FortifyServiceProvider.phpファイルを下記のように記述します。

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use App\Actions\Fortify\CreateNewUser;
use App\Actions\Fortify\ResetUserPassword;
use App\Actions\Fortify\UpdateUserPassword;
use App\Actions\Fortify\UpdateUserProfileInformation;
use Illuminate\Support\ServiceProvider;
use Laravel\Fortify\Fortify;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use Laravel\Fortify\Contracts\TwoFactorLoginResponse as TwoFactorLoginResponseContract;
use App\Http\Responses\LoginResponse;
use App\Http\Responses\TwoFactorLoginResponse;

class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->registerResponseBindings();
    }

    /**
     * Register the response bindings.
     *
     * @return void
     */
    protected function registerResponseBindings()
    {
        $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
        $this->app->singleton(TwoFactorLoginResponseContract::class, TwoFactorLoginResponse::class);
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {        
        Fortify::createUsersUsing(CreateNewUser::class);
        Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
        Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
        Fortify::resetUserPasswordsUsing(ResetUserPassword::class);
    }
}

上記を追加により、ログイン後の画面を変更できるようになるはずです!
laravel/uiの方が安定した技術かもしれませんが、推奨されているjetstreamのログインにチャレンジするのも今後の為に良いかもしれません。参考になれば!