#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"