Инерция стека Laravel 8 jetstream. Перенаправление на главную после входа в систему вместо выбора пользователя

Что происходит со мной, так это то, что если пользователь вводит URL-адрес: project.test/med, система перенаправляет на вход, но затем перенаправляет не на панель инструментов, а на мед. В RedirectIfAuthenticated выражение Auth::guard($guard)-›check() не оценивается или, по крайней мере, в журнале не отображается, поэтому я не могу определить, что происходит.

/** RedirectIfAuthenticated.php */
    public function handle($request, Closure $next, ...$guards)
    {
       $guards = empty($guards) ? [null] : $guards;
       Log::info($request);
       Log::info(Auth::user());
       foreach ($guards as $guard) {
         Log::info(Auth::guard($guard)->check());
         Log::info(Auth::check());
         if (Auth::guard($guard)->check()) {
            return redirect(RouteServiceProvider::HOME);
         }
      }
      Log::info(Auth::check());
      Log::info('end');
      return $next($request);
    }

    /** web.php */
     Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
         return Inertia\Inertia::render('Dashboard');
    })->name('dashboard');
    
    Route::middleware(['auth:sanctum','verified'])->get('/med', function (Request $request) {
         return Inertia\Inertia::render('Med');
    })->name('med');

person gioalvaro    schedule 30.09.2020    source источник
comment
Вы используете Laravel Jetstream?   -  person Raphael Cunha    schedule 01.10.2020
comment
Да, я только что отредактировал заголовок   -  person gioalvaro    schedule 01.10.2020


Ответы (4)


Промежуточное ПО RedirectIfAuthenticated делает не то, что вы думаете. Это промежуточное ПО проверяет, аутентифицирован ли пользователь при попытке доступа к маршруту с прикрепленным к нему промежуточным ПО guest. Таким образом, после того, как вы войдете в приложение и попытаетесь получить доступ к маршруту /login, это промежуточное ПО перехватит запрос и перенаправит пользователя на путь RouteServiceProvider::HOME.


С учетом сказанного, на момент написания этой статьи Laravel Fortify не предлагал возможности легко изменить, куда перенаправляется пользователь после регистрации или входа в приложение. Дополнительную информацию см. в выпуске

Чтобы заставить это работать, вам нужно будет пройти несколько шагов.

Шаг 1. Создайте новый класс LoginResponse.

В любом месте вашего приложения создайте класс LoginResponse и реализуйте Laravel\Fortify\Contracts\LoginResponse.

<?php

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class LoginResponse implements LoginResponseContract
{

    /**
     * @inheritDoc
     */
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? response()->json(['two_factor' => false])
            : redirect()->intended(config('fortify.home')); // This is the line you want to modify so the application behaves the way you want.
    }
}

Шаг 2. Переопределите ответ Fortify Login по умолчанию

На этом шаге вы должны указать Laravel использовать ваш ответ на вход вместо ответа Fortify по умолчанию.

<?php

namespace App\Providers;

use App\Http\Responses\LoginResponse;
use Illuminate\Support\ServiceProvider;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;

class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(
            LoginResponseContract::class, // Contract is required in order to make this step work.
            LoginResponse::class,
        );
    }

    //...
}

Как только вы закончите вносить изменения, пользователь будет перенаправлен туда, куда вы его настроили.

person Raphael Cunha    schedule 02.10.2020
comment
Я получаю, что целевой класс [App\Http\Responses\LoginResponse] не существует, есть идеи, что может быть не так? - person George Sharvadze; 23.10.2020
comment
@GeorgeSharvadze Если вы все сделали правильно и получаете эту ошибку, возможно, композитор не обновился. просто запустите composer dump-autoload и он перезагрузит все классы. - person Raphael Cunha; 03.11.2020
comment
@Raphael Cunha Большое спасибо за это. Вы также знаете, как перенаправить на другой сайт после регистрации? Я не хочу перенаправлять на панель инструментов jetstream. Спасибо заранее! - person treesoft; 14.11.2020

Перейдите в config/fortify.php и измените эту строку:

'home' => RouteServiceProvider::HOME,

to:

'home' => function(){
    //if you want to go to a specific route
    return route('dashboard');
  
    //or if you have a bunch of redirection options
    if (Auth::user()->hasRole('admin')) {
       return route('admin.dashboard');
    }
    else{
       return route('guest.dashboard');
    }
}
person estern76    schedule 20.02.2021
comment
Можете ли вы поделиться примером «параметров перенаправления»? Я не могу заставить это работать - person Mike Thrussell; 26.02.2021
comment
Да, конечно! Я обновил ответ. - person estern76; 27.02.2021
comment
Следование тому же вызывает preg_match() expects parameter 2 to be string, object given в маршруте регистрации. - person Ananth Sathvick; 15.04.2021

Для этого есть более простое решение.

Если вы посмотрите в config/fortiy.php, вы увидите, что для домашней переменной установлено значение:

'home' => RouteServiceProvider::HOME,

Это относится к общедоступной константной переменной в app/Providers/RouteServiceProvider.php

Таким образом, чтобы перенаправить пользователей на домашнюю страницу после входа в систему, вы можете просто изменить домашнюю переменную:

public const HOME = '/';

Выполнение этого способа немного менее сложно и избавляет вас от необходимости создавать совершенно новый класс ответа на вход.

Если изменения не вступят в силу сразу, попробуйте запустить:

php artisan optimize
person Laurence Rawlings    schedule 27.12.2020
comment
Это правильный способ сделать это. - person MrEduar; 21.01.2021

Просто откройте fortify в папке config

Найдите 'home' => RouteServiceProvider::HOME

и замените его своей логикой кода и не забудьте добавить фасады аутентификации

use Illuminate\Support\Facades\Auth;

вроде есть:

'home' => function () {
    $is_active = Auth::user()->is_active;
    $role = Auth::user()->role;
   
    if ($is_active == 1) {
        if ($role== 1) {
            return '/admin/dashboard';   
        } else {
            return '/';
        }
    } else {
        return '/login';
    }
},
person Franck Bokele    schedule 09.03.2021