'Voyager and Jetstream: Login to Admin Panel leads to Dashboard Page

I just started my first Laravel project and try to combine Jetstream Authentification with Voyager Admin Panel.

First of all, I installed Jetstream on a fresh Laravel installation and it worked so far:

Afterwards, I tried to add Voyager to generate the CRUDs for my website and added a new user with php artisan voyager:admin [email protected] --create

But whenever I tried to login through the url "../admin", I was redirected to "../dashboard" from Jetstream.

Even if I reentered "../admin" as URL, I was redirected. As long as I was logged in, I cannot enter the Voyager Backend.

So I guess it's some kind of routing / middleware issue, but I cannot find out which issue it is.

Within the web.php Routing file, there's only the basic stuff:

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
    return view('dashboard');
})->name('dashboard');


Route::group(['prefix' => 'admin'], function () {
    Voyager::routes();
});

Not sure if that's relevant, but my IDE recognizes Voyager:: as unknown class, even it works the same way on a different Laravel installation.

But from the look of it, I expected the Route::middleware() to redirect a logged in person which types the url "../dashboard" to the Dashboard view, but nothing more. Removing this Route also didnt help the problem, so I guess I was wrong.

But beside this, only the pure Voyager Routes are left, so I'm not sure where else I can look to solve this problem.



Solution 1:[1]

You can add custom responses on app/Http/Responses directory.

just make new responses called LoginResponse

then use this code

<?php
 
namespace App\Http\Responses;
 
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
 
class LoginResponse implements LoginResponseContract
{
    /**
     * @param  $request
     * @return mixed
     */
    public function toResponse($request)
    {
        $home = auth()->user()->is_admin ? '/admin' : '/dashboard';
 
        return redirect()->intended($home);
    }
}

Then, bind your LoginResponse in FortifyServiceProvider

You can use this code

<?php
namespace App\Providers;
// ...
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // ...
        $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mansjoer