Laravel Fortify Настройка перенаправления аутентификации

#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

Есть большая вероятность, что это будет добавлено в ближайшее время!