Bvk's avatar
Level 2

Prevent showing the login page when the user is already logged in

  • Laravel Version: 12.18.0
  • Nova Version: 5.7.3
  • PHP Version: 8.4.1
  • Database Driver & Version: Mysql 8.0.40
  • Operating System and Version: MacBook Pro
  • Browser type and version: Chrome 137.0.7151.104
  • Reproduction Repository: https://gitlab.com/bvk-dev/laravel-nova

Description:

Hi guys! I’m using Laravel 12 and Nova 5, Everything is working fine so far, but I ran into an issue:

When a user is already logged in (authenticated) and navigates to the /nova/login URL, instead of redirecting to the dashboard page (like /nova/dashboards/main or the main Nova page), it still shows the login page.

✅ What I expected: If the user is already logged in and tries to access the login page, they should be redirected to the dashboard page.

❌ What happens instead: The login form is shown again to the authenticated user.

Detailed steps to reproduce the issue on a fresh Nova installation:

https://github.com/user-attachments/assets/53cebfec-f038-4ed1-8494-cd5c4e3ddb37

0 likes
15 replies
Snapey's avatar

protect this route with the RedirectIfAuthenticated middleware

Bvk's avatar
Level 2

@Snapey Yes, I know, but it doesn't seem to be working properly.

Bvk's avatar
Level 2

I also tested this but it didn't work and when I type the login address again after logging in, it displays the same login page.

class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        $this->app->instance(LoginResponse::class, new class implements LoginResponse {
            public function toResponse($request)
            {
                return redirect('/test');
            }
        });
    }
Bvk's avatar
Level 2

Sure, this is my nova config:

Snapey's avatar

run php artisan route:list -vv

It will show the middleware applied to each route

Bvk's avatar
Level 2

@Snapey Thanks, that was a good point. When I run the command, the RedirectIfAuthenticated middleware was not applied to the admin/login path. Then I added it and it was added to the list, but it had no effect. When I typed in the login page address, it displayed it and not work.

config nova.php

'middleware' => [
        InitializeTenancyByDomain::class,
        PreventAccessFromCentralDomains::class,
        \Laravel\Nova\Http\Middleware\RedirectIfAuthenticated::class,
        'web',
        \Laravel\Nova\Http\Middleware\HandleInertiaRequests::class,
        'nova:serving',
    ],
GET|HEAD  admin/login ................................................................... nova.pages.login › Laravel\Nova › AuthenticatedSessionController@create
            ⇂ Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains
            ⇂ Stancl\Tenancy\Middleware\InitializeTenancyByDomain
            ⇂ Laravel\Nova\Http\Middleware\RedirectIfAuthenticated
            ⇂ Illuminate\Cookie\Middleware\EncryptCookies
            ⇂ Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
            ⇂ Illuminate\Session\Middleware\StartSession
            ⇂ Illuminate\View\Middleware\ShareErrorsFromSession
            ⇂ Illuminate\Foundation\Http\Middleware\ValidateCsrfToken
            ⇂ Illuminate\Routing\Middleware\SubstituteBindings
            ⇂ Laravel\Nova\Http\Middleware\HandleInertiaRequests
            ⇂ Laravel\Nova\Http\Middleware\DispatchServingNovaEvent
            ⇂ Laravel\Nova\Http\Middleware\BootTools

Bvk's avatar
Level 2

@ghabe Can I ask you to install a Laravel 12 with Nova 5 and test this yourself?

Bvk's avatar
Level 2

Issue updated. please review repository.

Bvk's avatar
Level 2

Finally, after a lot of testing and searching, I was able to solve this bug this way. I wonder why this problem hasn't been seen in Nova until now.

I defined a new middleware RedirectIfAuthenticated and placed it in the Nova middleware configuration section config/nova.php, ‍‍‍‍ and the problem was solved.

RedirectIfAuthenticated.php

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Closure;
use Laravel\Nova\Nova;
use Laravel\Nova\Util;

class RedirectIfAuthenticated
{
    public function handle(Request $request, Closure $next, ...$guards)
    {
        if (!\is_null($guard)) {
            trigger_deprecation('laravel/nova', '5.6.1', 'Guard parameter no longer supported via [%s] middleware', __CLASS__);
        }

        if (Auth::guard(Util::userGuard())->check()) {
            if ($request->is(ltrim(Nova::path(), '/') . '/login')) {
                return redirect(route('nova.pages.dashboard'));
            }
        }

        return $next($request);
    }
}

config/nova.php

.
.
.
 'middleware' => [
        'web',
        \App\Http\Middleware\RedirectIfAuthenticated::class,
        \Laravel\Nova\Http\Middleware\HandleInertiaRequests::class,
        'nova:serving',
    ],
.
.

Please or to participate in this conversation.