🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 重置密码 > {tip}**想要快速上手?**只需要在新建的 Laravel 应用中运行`php artisan make:auth`命令,然后在浏览器中打开`http://your-app.test/register`或者给你的应用分配任意一个 URL。 这个命令将会负责搭建起整个身份验证系统,包括重置密码! 大多数 web 应用都为用户提供了重置密码的功能。相较于强迫你在每个应用中都要重新实现一遍此功能,Laravel 提供了便捷的方法来发送密码提醒以及执行密码重置。 > {note} 在使用 Laravel 的密码重置功能之前,你的用户模型必须使用`Illuminate\Notifications\Notifiable`trait。 ## 数据库注意事项 首先, 请核实你的`App\User`模型是否实现了`Illuminate\Contracts\Auth\CanResetPassword`契约。当然,框架中包含的`App\User`模型已经实现了该接口,并且使用了`Illuminate\Auth\Passwords\CanResetPassword`trait 来包含实现该接口所需的方法。 #### 生成重置令牌的表迁移 接下来,必须创建一张数据表来存储密码重置令牌。该数据表的迁移已包含在 Laravel 应用的`database/migrations`目录中。 所以,你需要做的只是执行数据库迁移命令: ~~~php php artisan migrate ~~~ ## 路由 Laravel 已在`Auth\ForgotPasswordController`和`Auth\ResetPasswordController`类中包含了发送密码重置链接电子邮件和重置用户密码的逻辑。所有执行密码重置所需的路由可以使用 Artisan 命令`make:auth`来生成: ~~~php php artisan make:auth ~~~ ## 视图 当执行`make:auth`命令时,Laravel 会生成重置密码所需的所有视图。 这些视图位于`resources/views/auth/passwords`目录中。你可以根据你应用的需要随意修改这些视图。 ## 重置密码后 一旦你定义了重置用户密码的路由和视图,你可以在浏览器中访问`/password/reset`这个路由来重置密码。框架中的`ForgotPasswordController`已包含发送密码重置链接电子邮件的逻辑,而`ResetPasswordController`包含重置用户密码的逻辑。 重置密码后,用户就会自动登录并重定向到`/home`。 你可以通过在`ResetPasswordController`中定义一个`redirectTo`属性来自定义密码重置后重定向的位置: ~~~php protected $redirectTo = '/dashboard'; ~~~ > {note} 默认情况下,密码重置令牌会在一小时后过期。你可以通过`config/auth.php`文件中的密码重置`expire`选项对此进行修改。 ## 自定义 #### 自定义身份验证看守器 在你的`auth.php`配置文件中,你可以配置多个「看守器」,可以用来定义多个用户表的身份验证行为。你可以自定义框架中的`ResetPasswordController`,通过重写该控制器中的`guard`方法来使用你所选择的看守器。这个方法应当返回一个看守器实例: ~~~php use Illuminate\Support\Facades\Auth; protected function guard() { return Auth::guard('guard-name'); } ~~~ #### 自定义密码代理 在你的`auth.php`配置文件中,你可以配置多个密码「代理」,可以用来重置多个用户表上的密码。你可以自定义框架中的`ForgotPasswordController`和`ResetPasswordController`, 通过重写控制器中的`broker`方法来使用你所选择的代理: ~~~php use Illuminate\Support\Facades\Password; /** * 获取密码重置时所使用的代理。 * * @return PasswordBroker */ protected function broker() { return Password::broker('name'); } ~~~ #### 自定义密码重置邮件 你可以轻松地修改用于向用户发送密码重置链接的通知类。首先,重写`User`模型中的`sendPasswordResetNotification`方法。在此方法中,你可以使用任何你所选择的通知类来发送通知。该方法接收的第一个参数是密码重置令牌`$token`: ~~~php /** * 发送密码重置通知 * * @param string $token * @return void */ public function sendPasswordResetNotification($token) { $this->notify(new ResetPasswordNotification($token)); } ~~~