电子邮件验证
Introduction
许多 Web 应用程序要求用户在使用该应用程序之前验证其电子邮件地址。 Laravel 没有强迫您为您创建的每个应用程序手动重新实现此功能,而是提供了方便的内置服务来发送和验证电子邮件验证请求。
Note
想要快速入门?安装其中之一Laravel 应用程序入门套件 在一个新的 Laravel 应用程序中。初学者工具包将负责构建您的整个身份验证系统,包括电子邮件验证支持。
模型准备
在开始之前,请确认您的App\Models\User
模型实现了Illuminate\Contracts\Auth\MustVerifyEmail
合同:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
将此接口添加到您的模型后,新注册的用户将自动收到一封包含电子邮件验证链接的电子邮件。正如您通过检查您的应用程序所看到的App\Providers\EventServiceProvider
, Laravel 已经包含了一个SendEmailVerificationNotification
listener 附在Illuminate\Auth\Events\Registered
事件。此事件侦听器会将电子邮件验证链接发送给用户。
如果您在应用程序中手动实施注册而不是使用入门套件,你应该确保你正在派遣Illuminate\Auth\Events\Registered
用户注册成功后的事件:
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
数据库准备
接下来,你的users
表必须包含email_verified_at
列存储验证用户电子邮件地址的日期和时间。默认情况下,users
Laravel 框架自带的表迁移已经包含了这一列。因此,您需要做的就是运行数据库迁移:
php artisan migrate
Routing
要正确实施电子邮件验证,需要定义三个路由。首先,需要一个路由来向用户显示通知,告知他们应该单击 Laravel 在注册后发送给他们的验证电子邮件中的电子邮件验证链接。
其次,需要一个路由来处理用户单击电子邮件中的电子邮件验证链接时生成的请求。
第三,如果用户不小心丢失了第一个验证链接,将需要一个路由来重新发送验证链接。
邮箱验证通知
如前所述,应该定义一个路由,该路由将返回一个视图,指示用户单击注册后 Laravel 通过电子邮件发送给他们的电子邮件验证链接。当用户尝试访问应用程序的其他部分而不首先验证其电子邮件地址时,将向用户显示此视图。请记住,只要您的链接会自动通过电子邮件发送给用户App\Models\User
模型实现了MustVerifyEmail
界面:
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
返回邮箱验证通知的路由应该命名为verification.notice
.重要的是,路由被指定为这个确切的名称,因为verified
中间件包含在 Laravel 中 如果用户未验证其电子邮件地址,将自动重定向到此路由名称。
Note
手动实现邮箱验证时,需要您自己定义验证通知视图的内容。如果您想要包含所有必要的身份验证和验证视图的脚手架,请查看Laravel 应用程序入门套件.
电子邮件验证处理程序
接下来,我们需要定义一个路由来处理当用户单击通过电子邮件发送给他们的电子邮件验证链接时生成的请求。这条路线应该命名verification.verify
并被分配auth
和signed
中间件:
use Illuminate\Foundation\Auth\EmailVerificationRequest;
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');
在继续之前,让我们仔细看看这条路线。首先,您会注意到我们正在使用EmailVerificationRequest
请求类型而不是典型的Illuminate\Http\Request
实例。这EmailVerificationRequest
是一个表单请求 它包含在 Laravel 中。此请求将自动负责验证请求的id
和hash
参数。
接下来,我们可以直接调用fulfill
请求上的方法。此方法将调用markEmailAsVerified
对经过身份验证的用户的方法并分派Illuminate\Auth\Events\Verified
事件。这markEmailAsVerified
方法默认可用App\Models\User
模型通过Illuminate\Foundation\Auth\User
基类。一旦验证了用户的电子邮件地址,您就可以将他们重定向到任何您想要的地方。
重新发送验证邮件
有时用户可能会放错或不小心删除了电子邮件地址验证邮件。为了适应这一点,您可能希望定义一个路由以允许用户请求重新发送验证电子邮件。然后,您可以通过在您的验证通知查看:
use Illuminate\Http\Request;
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');
保护路线
路由中间件 可用于仅允许经过验证的用户访问给定路由。 Laravel 附带一个verified
中间件别名,这是Illuminate\Auth\Middleware\EnsureEmailIsVerified
班级。由于此中间件已在您的应用程序的 HTTP 内核中注册,因此您需要做的就是将中间件附加到路由定义中。通常,此中间件与auth
中间件:
Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware(['auth', 'verified']);
如果未经验证的用户尝试访问已分配此中间件的路由,他们将自动重定向到verification.notice
命名路线.
Customization
验证邮件自定义
虽然默认的电子邮件验证通知应该可以满足大多数应用程序的要求,但 Laravel 允许您自定义电子邮件验证邮件消息的构造方式。
首先,将闭包传递给toMailUsing
提供的方法Illuminate\Auth\Notifications\VerifyEmail
通知。闭包将接收正在接收通知的可通知模型实例以及用户必须访问以验证其电子邮件地址的签名电子邮件验证 URL。闭包应该返回一个实例Illuminate\Notifications\Messages\MailMessage
.通常,您应该调用toMailUsing
方法来自boot
你的应用程序的方法App\Providers\AuthServiceProvider
班级:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Register any authentication / authorization services.
*/
public function boot(): void
{
// ...
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
Note
要了解有关邮件通知的更多信息,请参阅邮件通知文件.
Events
当使用Laravel 应用程序入门套件, Laravel 调度events 在电子邮件验证过程中。如果您正在为您的应用程序手动处理电子邮件验证,您可能希望在验证完成后手动发送这些事件。您可以在您的应用程序中将侦听器附加到这些事件EventServiceProvider
:
use App\Listeners\LogVerifiedUser;
use Illuminate\Auth\Events\Verified;
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Verified::class => [
LogVerifiedUser::class,
],
];