#laravel #authentication #redirect #fortify #laravel-8
#laravel #аутентификация #перенаправление #укрепление #laravel-8
Вопрос:
В Laravel fortify при настройке процесса аутентификации я не могу перенаправить на страницу входа с сообщением об ошибке, что мы смогли сделать в Auth. Вот ссылка на документацию по настройке: https://jetstream.laravel.com/1.x/features/authentication.html#customizing-the-authentication-process
if ($user amp;amp; Hash::check($request->password, $user->password) amp;amp; $user->status == 'active') {
return $user;
} elseif ($user->status == 'inactive') {
//redirect with some error message to login blade
} elseif ($user->status == 'blocked') {
//redirect with some error message to login blade
}
Пожалуйста, помогите мне в этом.
Комментарии:
1. этот метод предназначен только для возврата пользователя, поэтому вы не можете сделать там какое-либо перенаправление…. вы можете вернуть
null
илиfalse
, но у вас не будет никакого пользовательского сообщения2. но в случае возврата сообщения пользователю, как я могу это сделать здесь, в fortify?
Ответ №1:
Для тех, кто приходит из поиска Google, который использует Laravel Jetstream
(который использует Fortify): Snapey
из Laracasts ответил на этот вопрос и создал учебник, в котором используется ваш собственный LoginResponse
, чтобы переопределить поведение входа по умолчанию.
Я сделал свой так, но, конечно, вы должны создать свой собственный в соответствии с вашими потребностями.
// app/Http/Responses/LoginResponse.php
namespace AppHttpResponses;
use IlluminateSupportFacadesAuth;
use LaravelFortifyContractsLoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
{
/**
* @param $request
* @return mixed
*/
public function toResponse($request)
{
// replace this with your own code
// the user can be located with Auth facade
$home = Auth::user()->is_admin ? config('fortify.dashboard') : config('fortify.home');
return $request->wantsJson()
? response()->json(['two_factor' => false])
: redirect($home);
}
}
Следующий шаг, который нужно изменить JetstreamServiceProvider
, чтобы использовать ваш LoginReponse
public function boot()
{
$this->configurePermissions();
Jetstream::deleteUsersUsing(DeleteUser::class);
// register new LoginResponse
$this->app->singleton(
LaravelFortifyContractsLoginResponse::class,
AppHttpResponsesLoginResponse::class
);
}
Надеюсь, это сэкономит вам время.
Ответ №2:
Я понимаю ваше разочарование документацией (или ее отсутствием). У меня была похожая проблема, и вот как мне удалось это сделать:
if ($user amp;amp; in_array($user->status_id, [1,2,3])) {
if (Hash::check($request->password, $user->password)) {
return $user;
}
}
else {
throw ValidationException::withMessages([
Fortify::username() => "Username not found or account is inactive. Please check your username.",
]);
}
https://github.com/laravel/fortify/issues/94#issuecomment-700777994
Комментарии:
1. Это действительно помогло в проверке ролей пользователей перед входом пользователя в систему
Ответ №3:
Для приложений SPA, которым требуется только пользовательский ответ JSON, а не ответ по умолчанию {two_factor: false}
.
Создайте пользовательский ответ, который реализует LoginResponse
контракт на укрепление (в данном случае я возвращаю объект user):
<?php
declare(strict_types=1);
namespace AppHttpResponses;
use LaravelFortifyContractsLoginResponse as LoginResponseContract;
use SymfonyComponentHttpFoundationResponse;
class LoginResponse implements LoginResponseContract
{
public function toResponse($request): Response
{
return response()->json(auth()->user());
}
}
Добавьте эту строку в метод загрузки FortifyServiceProvider
:
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
Убедитесь, что вы правильно импортировали пространства имен:
use AppHttpResponsesLoginResponse;
use LaravelFortifyContractsLoginResponse as LoginResponseContract;
Если вы все еще не получаете JSON с сервера, убедитесь, что ваш запрос имеет правильные заголовки. Это должен быть запрос XHR, который принимает application/json
.
Вдохновлен этой статьей из Laravel News.
Ответ №4:
например, пользовательское перенаправление после входа / выхода из системы / регистрации. По параметру запроса — псевдоним
В классе FortifyServiceProvider
Добавить.
use LaravelFortifyContractsLoginResponse;
use LaravelFortifyContractsLogoutResponse;
use LaravelFortifyContractsRegisterResponse;
А затем в методе register.
$this->app->instance(LogoutResponse::class, new class implements LogoutResponse {
public function toResponse($request)
{
return redirect('/'.$request->alias);
}
});
$this->app->instance(LoginResponse::class, new class implements LoginResponse {
public function toResponse($request)
{
return redirect()->intended('/'.$request->alias.'/admin/dashboard');
}
});
$this->app->instance(RegisterResponse::class, new class implements RegisterResponse {
public function toResponse($request)
{
return redirect('/'.$request->alias.'/admin/dashboard');
}
});
Ответ №5:
переход configfortify.php в строке 66 измените значение home на любой путь, который вы хотите
‘home’ => ‘/ dashboard’,
Ответ №6:
В настоящее время в Fortify нет способа настроить перенаправления.
Существует открытая проблема с запросом на это поведение здесь: https://github.com/laravel/fortify/issues/77
Есть большая вероятность, что это будет добавлено в ближайшее время!