Laravel 5.3 — Перенаправление при неудачной попытке входа в систему

#php #laravel #authentication #redirect #laravel-5.3

#php #laravel #аутентификация #перенаправление #laravel-5.3

Вопрос:

В моем приложении я использую аутентификацию по умолчанию с помощью Laravel 5.3. У меня есть два места, где пользователь может войти в систему, и я хочу, в случае неудачного входа в систему, перенаправить только в одно из этих двух мест. Другими словами, независимо от того, через какое представление пользователь входит в систему, если он отправляет неверные учетные данные, он всегда будет перенаправлен обратно на одно конкретное представление вместо того, из какого представления он отправил форму. В Laravel 5.1 похоже, что этого можно достичь, включив переменную $LoginPath в контроллер входа. В Laravel 5.3 они, похоже, исключили эту опцию из документации, поэтому я больше не уверен, как к этому подойти.

Любые мысли и / или советы приветствуются. Спасибо!

Ответ №1:

Редактировать: я неправильно понял ваш первоначальный вопрос. Это обновлено.

Если вам нужно настроить это, вы можете сделать что-то вроде:

Откройте AppHttpControllersAuthLoginController (согласно документам, это было бы сгенерировано php artian make:auth командой, которую, как я предполагаю, вы использовали) и добавьте это:

 /**
 * Get the failed login response instance.
 *
 * @param IlluminateHttpRequest  $request
 * @return IlluminateHttpResponse
 */
protected function sendFailedLoginResponse(Request $request)
{
    return redirect()->to('/the_redirect_location')
        ->withInput($request->only($this->username(), 'remember'))
        ->withErrors([
            $this->username() => Lang::get('auth.failed'),
        ]);
}
  

Это перезапишет тот же метод, который содержится в IlluminateFoundationAuthAuthenticatesUsers trait, который LoginController использует. Это та redirect()->to('/the_redirect_location') часть, которую я изменил. Первоначально это: redirect()->back() .

Если вы решите использовать этот метод, обязательно добавьте это в начало LoginController :

 use Lang;
use IlluminateHttpRequest;
  

Ответ №2:

На случай, если кто-то ищет решение для версии Laravel 5.7 . Я смог выполнить эту работу, добавив следующий sendFailedLoginResponse метод в LoginController

 /**
 * Get the failed login response instance.
 *
 * @param  IlluminateHttpRequest  $request
 * @return SymfonyComponentHttpFoundationResponse
 *
 * @throws IlluminateValidationValidationException
 */
protected function sendFailedLoginResponse()
{
    throw ValidationException::withMessages([
        $this->username() => [trans('auth.failed')],
    ])
    ->redirectTo("/the_redirect_location");
}
  

И не забудьте о следующем импорте:

 use IlluminateValidationValidationException;
  

Примечание: разница между этим методом и тем, который он переопределяет, IlluminateFoundationAuthAuthenticateUsers заключается в строке ->redirectTo("
/the_redirect_location");

Где /the_redirect_location находится URL-адрес, на который вы хотите перенаправить при сбое аутентификации.

Ответ №3:

Откройте файл Authenticate.php и измените метод redirectTo() следующим образом для каждого маршрута, который вы хотите перенаправить с которого произошел сбой.

 protected function redirectTo($request) {
  if (! $request->expectsJson()) {
    if ($request->path() == "user/dashboard"){
      return route('user.login.form');
    } else {
      return route('HOME');
    }
  }
}
  

Ответ №4:

Я столкнулся с этой проблемой при использовании Laravel 8 с усиленной аутентификацией и нашел путь к этой странице после поиска «laravel не удалось перенаправить при входе на домашнюю страницу».

Если у вас возникла проблема, из-за которой пользователи перенаправляются на домашнюю страницу, а не видят сообщение об ошибке при неправильном входе в систему, решение состоит в том, чтобы изменить вашу политику ссылок со «строгого происхождения» на «того же происхождения». Проблема задокументирована здесь: https://www.sentinelstand.com/article/laravel-redirects-break-when-using-origin-referrer-policy
https://laracasts.com/discuss/channels/laravel/laravel-8-fortify-redirect-after-fail-login

Чтобы решить проблему, ваш .htaccess должен включать что-то вроде этого:

 Header set Referrer-Policy "same-origin"