如何在 Jetstream 或 Fortify 中覆盖登录重定向

发布于 作者

How to override login redirects in Jetstream or Fortify image

最近,我在使用 Laravel Jetstream 的项目中遇到了一个场景,我需要根据用户的类型在登录后将用户重定向到不同的路由。假设您有普通用户和管理员,管理员有一个只有他们才能看到的特殊仪表盘。我通常更喜欢在管理员登录后将他们重定向到他们的特殊仪表盘。

使用 Laravel Jetstream 或 Fortify,并不立即清楚如何做到这一点,尤其是在使用双重身份验证时。

Jetstream 和 Fortify 中的身份验证工作原理

Jetstream 在后台使用 Laravel Fortify,因此对于运行 Fortify 本身的应用程序和运行 Jetstream 的项目,该过程完全相同。

Fortify 使用操作管道将每个请求通过一系列类,这些类负责执行单个任务,例如尝试验证用户或在用户设置了双重身份验证时重定向他们。

如何覆盖重定向步骤

如果需要,Fortify 允许您完全自定义这些管道,但有一种更简单的方法来覆盖重定向步骤。

身份验证管道中的最后一步从服务容器中获取 Laravel\Fortify\Contracts\LoginResponse 类并返回它。这意味着我们可以用我们自己的自定义 LoginResponse 类覆盖 LoginResponse 类,并在那里执行自定义重定向。

默认的 LoginResponse 类如下所示

<?php
 
namespace Laravel\Fortify\Http\Responses;
 
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
 
class LoginResponse implements LoginResponseContract
{
/**
* Create an HTTP response that represents the object.
*
* @param \Illuminate\Http\Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function toResponse($request)
{
return $request->wantsJson()
? response()->json(['two_factor' => false])
: redirect()->intended(config('fortify.home'));
}
}

由于 Fortify 使用执行单个任务的操作,因此 LoginResponse 步骤非常简洁明了。

要自定义重定向,首先让我们在 app/Http/Responses 目录中添加我们自己的自定义 LoginResponse 类。然后,我们可以自定义 toResponse 方法,根据用户的类型将用户重定向到不同的路由。

<?php
 
namespace App\Http\Responses;
 
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
 
class LoginResponse implements LoginResponseContract
{
/**
* @param $request
* @return mixed
*/
public function toResponse($request)
{
$home = auth()->user()->is_admin ? '/admin' : '/dashboard';
 
return redirect()->intended($home);
}
}

然后,在 FortifyServiceProvider 中,我们需要绑定我们自己的自定义 LoginResponse 类,以便覆盖 Fortify 提供的默认类。

<?php
 
namespace App\Providers;
 
// ...
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
 
class FortifyServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// ...
 
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
}
}

双重身份验证

这几乎完美地满足了我的需求。但是,还缺少一个部分 - 双重身份验证。如果用户启用了双重身份验证并登录,Fortify 将返回不同的响应类。幸运的是,双重身份验证类也绑定到服务容器。这次,我们需要在容器中覆盖 Laravel\Fortify\Http\Responses\TwoFactorLoginResponse 类。在 FortifyServiceProvider 中添加几行代码应该可以解决问题。

<?php
 
namespace App\Providers;
 
// ...
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use Laravel\Fortify\Contracts\TwoFactorLoginResponse as TwoFactorLoginResponseContract;
 
class FortifyServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// ...
 
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
$this->app->singleton(TwoFactorLoginResponseContract::class, LoginResponse::class);
}
}

注意:我使用相同的自定义 LoginResponse 类覆盖 TwoFactorLoginResponse 类,因为功能应该完全相同。

覆盖其他 Jetstream 和 Fortify 功能

Jetstream 和 Fortify 中的其他功能可以通过非常相似的方式进行自定义。如果您深入研究包中包含的 FortifyServiceProvider(不是特定于您的项目的那个)并向下滚动到 registerResponseBindings 方法,您应该看到类似于以下内容

<?php
 
namespace Laravel\Fortify;
 
// ...
 
class FortifyServiceProvider extends ServiceProvider
{
// ...
 
/**
* Register the response bindings.
*
* @return void
*/
protected function registerResponseBindings()
{
$this->app->singleton(FailedPasswordConfirmationResponseContract::class, FailedPasswordConfirmationResponse::class);
$this->app->singleton(FailedPasswordResetLinkRequestResponseContract::class, FailedPasswordResetLinkRequestResponse::class);
$this->app->singleton(FailedPasswordResetResponseContract::class, FailedPasswordResetResponse::class);
$this->app->singleton(FailedTwoFactorLoginResponseContract::class, FailedTwoFactorLoginResponse::class);
$this->app->singleton(LockoutResponseContract::class, LockoutResponse::class);
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
$this->app->singleton(TwoFactorLoginResponseContract::class, TwoFactorLoginResponse::class);
$this->app->singleton(LogoutResponseContract::class, LogoutResponse::class);
$this->app->singleton(PasswordConfirmedResponseContract::class, PasswordConfirmedResponse::class);
$this->app->singleton(PasswordResetResponseContract::class, PasswordResetResponse::class);
$this->app->singleton(RegisterResponseContract::class, RegisterResponse::class);
$this->app->singleton(SuccessfulPasswordResetLinkRequestResponseContract::class, SuccessfulPasswordResetLinkRequestResponse::class);
}
 
// ...
}

这意味着如果需要,您的项目中可以覆盖所有这些响应类!

Jason Beggs photo

TALL 技术栈(Tailwind CSS、Alpine.js、Laravel 和 Livewire)顾问以及 designtotailwind.com 的所有者。

Cube

Laravel 新闻稿

加入 40k+ 其他开发者,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自无妥协播客的两名经验丰富的开发人员,现在可以为您的 Laravel 项目雇用。 ⬧ 固定费率 7500 美元/月。 ⬧ 无需冗长的销售流程。 ⬧ 无需合同。 ⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,使您的应用程序保持新鲜感。

Shift
Bacancy logo

Bacancy

只需 2500 美元/月,即可为您的项目配备经验丰富的 Laravel 开发人员,拥有 4-6 年的经验。获取 160 小时的专用专业知识和 15 天无风险试用。立即预约电话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的力量带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,它包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账、管理面板、用户仪表盘、身份验证、现成的组件、统计信息、博客、文档等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝 Laravel 升级、降低成本和加速创新以取得成功的合作伙伴

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。在使用熟悉的 Eloquent API 的同时支持事务性、搜索、分析和移动用例。了解 MongoDB 的灵活的现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖项输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包向您的 Laravel 应用程序添加评论

阅读文章