重置密码

简介

想要快速开始?只需在新的 Laravel 应用上运行 php artisan make:auth,并将浏览器导航到 http://your-app.test/register 或其它分配给应用的 URL 就行了。此命令将搭建好整个认证系统,包括重置密码!

大多数 Web 应用都为用户提供了重置密码的功能。Laravel 不强迫您在每个应用上重新实现该功能,而是提供了便捷的方法来发送密码提醒和完成密码重置。

在使用 Laravel 密码重置功能之前,确保用户模型引入了 Illuminate\Notifications\Notifiable Trait。

数据库注意事项

首先,确保 App\User 模型实现了 Illuminate\Contracts\Auth\CanResetPassword Contract。当然,框架包含的 App\User 模型已经实现了该接口,并使用 Illuminate\Auth\Passwords\CanResetPassword Trait 包含了实现该接口所需的方法。

生成重置令牌的表迁移

接下来,必须创建一张数据表来存储密码重置令牌。Laravel 自带了该表的迁移,并存放在 database/migrations 目录中。因此,只需要运行数据库迁移:

php artisan migrate

路由

Laravel 的 Auth\ForgotPasswordControllerAuth\ResetPasswordController 类包含了发送密码重置链接邮件和重置用户密码所必需的逻辑。可以使用 Artisan 命令 make:auth 生成密码重置所需的全部路由:

php artisan make:auth

视图

同样,Laravel 会在运行 make:auth 命令时生成密码重置所需的全部视图。这些视图位于 resources/views/auth/passwords 中。您可以根据应用需要自由自定义这些视图。

重置密码后

定义重置用户密码的路由和视图后,就可以在浏览器中通过 /password/reset 访问路由。框架的 ForgotPasswordController 已经包含了发送密码重置链接邮件的逻辑,而 ResetPasswordController 包含了重置用户密码的逻辑。

密码重置后,用户会自动登录应用并被重定向到 /home。可以通过定义 ResetPasswordControllerredirectTo 属性自定义密码重置后重定向的位置:

protected $redirectTo = '/dashboard';

默认情况下,密码重置令牌在一小时后过期。可以通过 config/auth.php 文件的密码重置选项 expire 进行更改。

自定义

自定义认证看守器

auth.php 配置文件中,可以配置多个「看守器」为多个用户表定义认证行为。可以通过重写控制器的 guard 方法自定义 ResetPasswordController 中选择使用的看守器。此方法应该返回一个看守器实例:

use Illuminate\Support\Facades\Auth;

protected function guard()
{
    return Auth::guard('guard-name');
}

自定义密码代理商

auth.php 配置文件中,可以配置多个密码「代理商」为多个用户表重置密码。可以通过重写 broker 方法自定义 ForgotPasswordControllerResetPasswordController 中选择使用的中间人:

use Illuminate\Support\Facades\Password;

/**
 * 获取密码重置时使用的代理商
 *
 * @return PasswordBroker
 */
protected function broker()
{
    return Password::broker('name');
}

自定义重置邮件

可以轻松修改用于向用户发送密码重置链接的通知类。首先,重写 User 模型的 sendPasswordResetNotification 方法。在此方法中,可以使用任何选择的通知类来发送通知。密码重置 $token 是该方法接收的第一个参数:

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