Laravel Fortify 自定义认证重定向。

13
在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
        }

请帮助我解决这个问题。


那个方法仅用于返回用户,因此您不能在其中进行任何重定向... 您可以返回 nullfalse,但您将没有任何自定义消息。 - lagbox
但是在Fortify中,如果我要将消息返回给用户,该怎么做呢? - SK Toke
6个回答

9

对于那些使用 Laravel Jetstream(它使用 Fortify)的谷歌搜索用户:LaracastsSnapey回答了这个问题 并制作了一个 教程,该教程使用您自己的 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以使用您的LoginResponse
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
    );
}

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


8

我理解您对文档(或缺乏文档)感到不满。我曾经遇到过类似的问题,这是我处理的方法:

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


在登录用户之前检查用户角色确实是有帮助的。 - ManuEl Magak

7
例如 - 登录/注销/注册后自定义重定向。通过请求参数 - 别名。
在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');
        }
    });

最好的方法...像魔法一样奏效! - Nowdeen
这是正确的方式,文档在这里记录:https://laravel.com/docs/10.x/fortify#customizing-authentication-redirects - undefined

6
对于仅需自定义 JSON 响应而不是默认的 {two_factor: false} 的 SPA 应用程序。
创建一个实现 Fortify LoginResponse 合同的自定义响应(在这种情况下,我返回用户对象):
<?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 上的这篇文章启发。

1

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

'home' => '/dashboard',


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接