重置密码


简介

大多数 Web 应用都提供了为用户重置密码的功能,Laravel 也不例外,Laravel 提供了用于发送密码重置链接及实现密码重置逻辑的便捷方法,而不需要你在每个应用中自己重复实现。

注:在使用 Laravel 提供的密码重置功能之前,User 模型必须使用了 Illuminate\Notifications\Notifiable Trait。

快速实现

如果想要快速搭建密码重置功能,可以基于 Laravel Jetstream 内置的认证脚手架代码。迁移完数据库后,就可以导航到 /register 或者其他 URL 进行体验,Jetstream 提供了完整的用户认证功能,包含密码重置。

数据库相关

开始之前,先验证 App\Models\User 模型实现了 Illuminate\Contracts\Auth\CanResetPassword 契约。当然,Laravel 自带的 App\Models\User 模型已经实现了该接口,并使用 Illuminate\Auth\Passwords\CanResetPassword Trait 来包含实现该接口需要的方法。

生成重置令牌表迁移

接下来,用来存储密码重置令牌的表必须被创建,Laravel 已经自带了这张表的迁移,就存放在 database/migrations 目录。所以,你所要做的仅仅是运行迁移:

php artisan migrate

这张表就是 password_resets

-w851

路由

Laravel Jetstream 已经内置了密码重置功能所需的所有路由,想要了解如何安装 Jetstream,参考官方提供的 Jetstream 文档即可。

视图

Laravel Jetstream 已经内置了密码重置功能所需的所有视图,想要了解如何安装 Jetstream,参考官方提供的 Jetstream 文档即可。

功能演示

注:由于密码重置功能要使用邮件发送功能,这里为了简化演示流程,我们在 .env 中将 MAIL_MAILER 配置为 log,这样就不会真的发送邮件,而是将邮件内容记录到日志中,我们通过查看日志获取密码重置链接即可。

对于 Jetstream 提供的密码重置功能,只需要在浏览器中通过 /forgot-password 路由即可进入发送重置密码链接的页面:

Laravel 8 Reset Password

输入注册邮箱,点击发送密码重置链接,就会发送密码重置链接到该邮箱(这里使用 log 驱动进行模拟),发送成功后会有提示文本(红框内):

Laravel 8 Reset Password

打开系统默认日志文件 storage/logs/laravel.log,拉到最后,就可以看到刚刚发送的邮件内容:

-w1366

注意红框内的文本,就是重置密码的链接,将这个链接拷贝到浏览器中访问,就可以进入密码重置页面:

Laravel 8 Reset Password

填写表单提交之后即可重置密码。密码被重置后,用户将会被重定向到登录页面使用新密码进行登录认证。

注:默认情况下,密码重置令牌一小时内有效(即重置链接中的 token 路由参数),你可以通过修改 config/auth.php 文件中的选项 expire 来改变有效时间。

自定义

自定义密码重置邮件

你可以轻松编辑发送密码重置链接给用户的通知类来自定义密码重置邮件,要实现这一功能,需要重写 User 模型上的 sendPasswordResetNotification 方法,在这个方法中,你可以使用任何你所喜欢的通知类发送通知,该方法接收的第一个参数是密码重置 $token

/**
 * 发送密码重置通知.
 *
 * @param  string  $token
 * @return void
 */
public function sendPasswordResetNotification($token)
{
    $this->notify(new ResetPasswordNotification($token));
}

Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 哈希

>> 下一篇: Artisan 控制台