重置密码

介绍

{tip} 想要快速上手? 只需在一个新的 Laravel 应用中运行 php artisan make:auth 命令,然后在浏览器中访问 http://your-app.dev/register 或分配给应用的任何别的 URL。这条命令将搭建起整个身份验证系统,包括重置密码!

大多数 Web 应用都为用户提供了重置密码的功能。相比强迫你在每个应用中都要重实现一遍此功能,Laravel 提供了便捷的方法来发送密码提醒和执行密码重置。

{note} 在使用 Laravel 的密码重置功能之前,你的用户模型必须使用 Illuminate\Notifications\Notifiable trait。

数据库注意事项

首先,请核实你的 App\User 模型是否实现了 Illuminate\Contracts\Auth\CanResetPassword 契约。当然,Laravel 框架中包含的 App\User 模型已经实现了该接口,并使用 Illuminate\Auth\Passwords\CanResetPassword trait 来包含实现该接口所需的方法。

生成重置令牌的表迁移

接下来,必须创建一个数据表来存储密码重置令牌。该数据表的迁移已包含在 Laravel 应用的 database/migrations 目录中。因此,你需要做的只是运行数据库迁移命令:

  1. php artisan migrate

路由

Laravel 已在 Auth\ForgotPasswordControllerAuth\ResetPasswordController 类中包含了发送密码重置链接电子邮件和重置用户密码所需的逻辑。所有执行密码重置所需的路由可以使用 Artisan 命令 make:auth 生成:

  1. php artisan make:auth

视图

当执行 make:auth 命令时,Laravel 会生成重置密码所需的所有视图,这些视图放置在 resources/views/auth/passwords 目录中。你可以根据需要随意修改它们。

重置密码之后

一旦你定义了重置用户密码的路由和视图,你可以在浏览器中访问 /password/reset 这个路由来重置密码。框架中的 ForgotPasswordController 已包含发送密码重置链接电子邮件的逻辑,而 ResetPasswordController 则包含重置用户密码的逻辑。

密码重置之后,用户将自动登录并重定向到 /home。 你可以通过在 ResetPasswordController 中定义一个 redirectTo 属性来自定义密码重置后重定向的位置:

  1. protected $redirectTo = '/dashboard';

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

自定义

自定义身份验证看守器

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

  1. use Illuminate\Support\Facades\Auth;
  2. protected function guard()
  3. {
  4. return Auth::guard('guard-name');
  5. }

自定义密码代理

在你的 auth.php 配置文件中,你可以配置多个密码「代理」,用来重置多个用户表上的密码。你可以通过重写 ForgotPasswordControllerResetPasswordController 控制器的 broker 方法来使用你所选择的代理:

  1. use Illuminate\Support\Facades\Password;
  2. /**
  3. * 获取重置密码时使用的代理。
  4. *
  5. * @return PasswordBroker
  6. */
  7. protected function broker()
  8. {
  9. return Password::broker('name');
  10. }

自定义密码重置邮件

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

  1. /**
  2. * 发送密码重置通知。
  3. *
  4. * @param string $token
  5. * @return void
  6. */
  7. public function sendPasswordResetNotification($token)
  8. {
  9. $this->notify(new ResetPasswordNotification($token));
  10. }

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。