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

В Laravel fortify при настройке процесса аутентификации я не могу перенаправить на страницу входа с сообщением об ошибке, которое мы смогли сделать в Auth. Вот ссылка на документацию по настройке: https://jetstream.laravel.com/1.x/features/authentication.html#customizing-the-authentication-process

        if ($user && Hash::check($request->password, $user->password) && $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
        }

Пожалуйста, помогите мне в этом.


person SK Toke    schedule 26.09.2020    source источник
comment
этот метод предназначен только для возврата пользователя, поэтому вы не можете выполнять там перенаправление .... вы можете вернуть null или false, но у вас не будет никакого настраиваемого сообщения   -  person lagbox    schedule 26.09.2020
comment
но в случае возврата сообщения пользователю, как я могу сделать это здесь, в укреплении?   -  person SK Toke    schedule 26.09.2020


Ответы (6)


Я понимаю ваше разочарование по поводу документации (или ее отсутствия). У меня была похожая проблема, и вот как мне это удалось:

if ($user && 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

person DinosaurHunter    schedule 14.10.2020
comment
Это действительно помогло в проверке ролей пользователей перед входом пользователя в систему. - person ManuEl Magak; 03.02.2021

Для тех, кто приходит из поиска Google и использует Laravel Jetstream (который использует Fortify): Snapey of Laracasts ответил на этот вопрос и сделал учебник, в котором используется ваш собственный LoginResponse, чтобы переопределить поведение входа по умолчанию.

Я сделал свой такой, но, конечно, вы должны создать свой собственный в соответствии с вашими потребностями.

// app/Http/Responses/LoginResponse.php
namespace App\Http\Responses;

use Illuminate\Support\Facades\Auth;
use Laravel\Fortify\Contracts\LoginResponse 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(
        \Laravel\Fortify\Contracts\LoginResponse::class,
        \App\Http\Responses\LoginResponse::class
    );
}

Надеюсь, это сэкономит вам время.

person TeyM    schedule 01.12.2020

В настоящее время в Fortify нет возможности настраивать перенаправления.

Существует открытая проблема с запросом этого бахавиора здесь: https://github.com/laravel/fortify/issues/77

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

person P. K. Tharindu    schedule 26.09.2020

Для приложений SPA, которым требуется только настраиваемый ответ JSON, а не значение по умолчанию {two_factor: false}.

Создайте собственный ответ, который реализует LoginResponse контракт Fortify (в этом случае я возвращаю объект пользователя):

<?php

declare(strict_types=1);

namespace App\Http\Responses;

use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use Symfony\Component\HttpFoundation\Response;

class LoginResponse implements LoginResponseContract
{
    public function toResponse($request): Response
    {
        return response()->json(auth()->user());
    }
}

Добавьте эту строку в метод загрузки FortifyServiceProvider:

$this->app->singleton(LoginResponseContract::class, LoginResponse::class);

Убедитесь, что вы правильно импортировали пространства имен:

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

Если вы по-прежнему не получаете JSON с сервера, убедитесь, что ваш запрос имеет правильные заголовки. Это должен быть запрос XHR, который принимает application/json.

На основе этой статьи из Laravel News.

person hatef    schedule 02.05.2021

goto \ config \ fortify.php в строке 66, измените значение home на любой путь, который хотите

'home' = ›'/ dashboard',

person ass-king some question    schedule 23.05.2021

например - настраиваемое перенаправление после входа в систему / выхода из системы / регистрации. По параметру запроса - псевдоним

В классе FortifyServiceProvider

Добавлять.

use Laravel\Fortify\Contracts\LoginResponse;
use Laravel\Fortify\Contracts\LogoutResponse;
use Laravel\Fortify\Contracts\RegisterResponse;

А затем в методе регистрации.

    $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');
        }
    });
person Qaurusai    schedule 17.06.2021