phplaravelauthentication

How to Prevent Authenticated Users from Accessing the Login Page in Laravel 12


in my laravel 12 project, I use 2 tables for authentication, i.e. the users table and the admin_users table which are both extended Authenticatable in the model. When a logged-in user navigates to a url http://127.0.0.1:8000/login_jemaat laravel redirects it to the http://127.0.0.1:8000/admin/login page, which I shouldn't want. How do I fix this problem, so when a logged-in user navigates to a url http://127.0.0.1:8000/login_jemaat laravel will redirects it to http://127.0.0.1:8000/

Users

class User extends Authenticatable
{
}

AdminUser

class AdminUser extends Authenticatable
{
}

config/auth.php:

<?php

return [

    'defaults' => [
        'guard' => env('AUTH_GUARD', 'users'),
        'passwords' => env('AUTH_PASSWORD_BROKER', 'users'),
    ],

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

        'admin_users' => [
            'driver' => 'session',
            'provider' => 'admin_users',
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

        'admin_users' => [
            'driver' => 'eloquent',
            'model' => App\Models\AdminUser::class,
        ],
    ],


    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
            'expire' => 60,
            'throttle' => 60,
        ],

        'admin_users' => [
            'provider' => 'admin_users',
            'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'),
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

    'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800),
];

bootstrap/app.php:

->withMiddleware(function (Middleware $middleware) {
        $middleware->redirectGuestsTo(function (Request $request) {
            // Jika URL mengarah ke dashboard (atau sub-path-nya), arahkan ke halaman admin login
            if ($request->is('dashboard') || $request->is('dashboard/*')) {
                return route('admin.login');
            }
            // Defaultnya untuk pengguna jemaat
            return route('pages.login');
        });
    })

route/web.php:

Route::middleware('guest:users')->group(function () {
    Route::get('/login_jemaat', function () {
        return view('pages.login');
    })->name('pages.login');

    Route::get('/register_jemaat', function () {
        return view('pages.register');
    })->name('pages.register');
Route::post('/register_jemaat', [PageController::class, 'register'])->name('register_jemaat');
    Route::post('/login_jemaat', [PageController::class, 'login'])->name('login_jemaat');
});

Route::middleware('guest:admin_users')->group(function () {
    Route::get('/admin/login', [AdminAuthController::class, 'index'])->name('admin.login');
    Route::post('/admin/login', [AdminAuthController::class, 'login'])->name('admin.login.submit');
});

Thank you everyone


Solution

  • In laravel 12, to redirect users if authenticated. Check the document.

    From laravel 11, you can use redirectUsersTo to check user is authenticated in bootstrap/app.php.

    bootstrap/app.php

    use Illuminate\Foundation\Application;
    use Illuminate\Foundation\Configuration\Middleware;
    use Illuminate\Http\Request;
    
    return Application::configure(basePath: dirname(__DIR__))
        ...
        ->withMiddleware(function (Middleware $middleware) {
            ...
            $middleware->redirectUsersTo(function (Request $request): string {
                if (auth()->guard('admin_users')->check()) {
                    return 'dashboard';
                }
    
                return '/';
            });
            ...
        })
        ...