Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Fortify認証

解決したいこと

laravel Fortifyで結論から言うと管理者画面用のログイン機能を実装したいです。

一般ユーザー用のサイトは作り終わったので管理者画面も同じくfortifyでログイン機能をつけたいのですがうまくいきません。
エラーメッセージはないのですがログインする際に一般ユーザー用のindex.blade.phpに遷移されます。それを管理者画面用のdashboard.blade.phpに遷移するようにしたい。

管理者用画面はアカウントを登録する画面は不要なのでテストする際はphpmyadminでアカウントを挿入してそれでログインしてみて確認してました。

Providers/FortifyServiceProvider.php

public function boot(): void
    {
        Fortify::createUsersUsing(CreateNewUser::class);

        // 登録画面の設定
        Fortify::registerView(function () {
            return view('auth.register');
        });

        // ログイン画面の設定
        Fortify::loginView(function () {
            return view('auth.login');
        });

        // カスタム認証ロジック(管理者認証)
        Fortify::authenticateUsing(function (Request $request) {
            Log::info('Attempting login for admin: ' . $request->email); // ログ:メールアドレス確認

            // 入力されたメールアドレスで管理者を検索
            $admin = Admin::where('email', $request->email)->first();

            if (!$admin) {
                Log::info('Admin not found: ' . $request->email); // ログ:管理者が見つからない場合
                return null;
            }

            // パスワードの一致を確認
            if (Hash::check($request->password, $admin->password)) {
                Log::info('Admin authenticated successfully: ' . $admin->email); // ログ:認証成功
                return $admin;
            } else {
                Log::info('Password mismatch for admin: ' . $request->email); // ログ:パスワードが一致しない場合
                return null;
            }
        });

        // ログイン後のリダイレクト先の設定
        Fortify::redirects('login', function () {
            if (Auth::guard('admin')->check()) {
                Log::info('Redirecting admin to dashboard'); // ログ:管理者用リダイレクト
                return '/admin/dashboard'; // 管理者用ダッシュボードにリダイレクト
            } else {
                Log::info('Redirecting user to home'); // ログ:一般ユーザー用リダイレクト
                return '/'; // 一般ユーザー用のホームページにリダイレクト
            }
        });

        // ログイン試行制限
        RateLimiter::for('login', function (Request $request) {
            $email = (string) $request->email;

            return Limit::perMinute(10)->by($email . $request->ip());
        });
    }

自分で試したこと

config/auth.phpそれぞれに'admins'=>[]を追加したりもしました。まだ初心者で詳しくはないので教えていただけると助かります。

0

1Answer

LaravelではMulti Authは推奨されていない(認証に使うmodelは一つを前提としている)ので、初心者であればroleを使用した一般的な実装方法で作りなおし、認可でコントロールする方が良いです。(Laravelの認証サービスがMulti Authな実装を考慮していません)

ネットで調べるとコピペで実装できそうに誤解させる情報が出てくると思いますが、パスワードリセット、メール検証を行おうとする段階で詰みます。

もしMulti Authで実装するのであれば、Laravelの認証サービスの中身を読まなくてはならないので現状のスキルでは無理です。
*それほど高いハードルでは無いですが、実務経験で2-3年程度は必要だと思います。

また、実装を人に任せる場合も、メンテナンスがきつくなるので覚悟が必要です。

1Like

Comments

  1. @Black_Cp

    Questioner

    アドバイスを参考にしました!
    実際にコントローラーでやってみたらできました!ありがとうございます!

Your answer might help someone💌