Laravel Fortify自定义身份验证重定向

问题描述

在Laravel加强自定义身份验证过程中,我无法重定向到带有错误消息的登录页面,而这是我们能够在Auth中完成的。 这是自定义文档链接https://jetstream.laravel.com/1.x/features/authentication.html#customizing-the-authentication-process

sudo systemctl restart Nginx

请帮助我。

解决方法

我了解您对文档的不满(或缺少文档)。我有一个类似的问题,这就是我设法做到的:

@helper.form(action = routes.DemoController.submitLogin())
@helper.form(action = routes.demo.controllers.DemoController.submitLogin())
@helper.form(action = routes.demo.DemoController.submitLogin())
@helper.form(action = demo.controllers.routes.DemoController.submitLogin())
@helper.form(action = demo.routes.DemoController.submitLogin())

https://github.com/laravel/fortify/issues/94#issuecomment-700777994

,

对于那些使用Laravel Jetstream(使用Fortify)的来自Google搜索的用户: Snapey个Laracasts answered this question,并制作了一个tutorial,它使用您自己的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
    );
}

希望它可以节省您的时间。

,

当前,Fortify无法自定义重定向。

这里有一个公开的问题要求这种行为:https://github.com/laravel/fortify/issues/77

很有可能会很快添加!

,

对于只需要自定义 JSON 响应而不是默认 {two_factor: false} 响应的 SPA 应用程序。

创建一个实现 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,请确保您的请求具有正确的标头。它应该是一个接受 application/json 的 XHR 请求。

灵感来自 Laravel News 的 this 文章。

,

转到 \config\fortify.php 第 66 行,将 home 值更改为您想要的任何路径

'home' => '/dashboard',

,

例如 - 登录/注销/注册后的自定义重定向。通过请求参数 - 别名

在 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');
        }
    });