密码重设的步骤
- 用户点击重设密码链接并跳转到重设密码页面;
- 在重设密码页面输入邮箱信息并提交;
- 控制器通过该邮箱查找到指定用户并为该用户生成一个密码令牌,接着将该令牌以链接的形式发送到用户提交的邮箱上;
- 用户查看自己个人邮箱,点击重置密码链接跳转到重置密码页面;
- 用户在该页面输入自己的邮箱和密码并提交;
- 控制器对用户的邮箱和密码重置令牌进行匹配,匹配成功则更新用户密码;
保存密码重置令牌的数据表
在密码重设功能中,我们还会用到一个用来保存密码重置令牌的数据表,Laravel 已默认为我们生成好了该数据表。
database/migrations/2014_10_12_100000_create_password_resets_table.php
可以看到 Laravel 默认生成的密码重置表有三个字段 email, token, created_at,分别用于生成用户邮箱、密码重置令牌、密码重置令牌的创建时间,并为邮箱和密码重置令牌加上了索引,这样在数据库使用这两个字段进行查找时效率更快。
由于我们在前面已经执行过了迁移,因此现在我们的数据库已经拥有了 password_resets 表,无需再次运行迁移生成。
密码重设控制器
Laravel 将密码重设功能相关的逻辑代码都放在了 ForgotPasswordController 和 ResetPasswordController 中,因此我们接下来需要将重设密码相关的路由指定到该控制器上。
routes/web.php
name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');
该路由列表的信息如下所示:
HTTP请求 | URL | 动作 | 作用 |
---|---|---|---|
GET | /password/reset | Auth\ForgotPasswordController @showLinkRequestForm | 显示重置密码的邮箱发送页面 |
POST | /password/email | Auth\ForgotPasswordController @sendResetLinkEmail | 邮箱发送重设链接 |
GET | /password/reset/{token} | Auth\ResetPasswordController @showResetForm | 密码更新页面 |
POST | /password/reset | Auth\ResetPasswordController @reset | 执行密码更新操作 |
现在路由已配置完成,由于 Laravel 在 ForgotPasswordController 和 ResetPasswordController 中已经为我们处理好一些相关逻辑,因此我们现在只需要将精力专注于视图的构建就行了。
相关视图
修改用户的登录页面,添加修改密码的链接。
resources/views/sessions/create.blade.php
@extends('layouts.default')
@section('title', '登录')
@section('content')
登录
@include('shared._errors')
还没账号?现在注册!
@stop
重置密码表单
Laravel 生成的密码控制器在 getEmail 动作中返回的视图为 auth.passwords.email,因此让我们新建该视图,并在里面加上用户重置密码的表单。
resources/views/auth/passwords/email.blade.php
@extends('layouts.default')
@section('title', '重置密码')
@section('content')
重置密码
@if (session('status'))
{{ session('status') }}
@endif
@endsection
getReset 动作对应的 auth.passwords.reset 视图构建如下。
resources/views/auth/passwords/reset.blade.php
@extends('layouts.default')
@section('title', '更新密码')
@section('content')
更新密码
@if (session('status'))
{{ session('status') }}
@endif
@endsection
修改重定向地址
Laravel 在 ResetPasswordController 中默认为我们设置好了密码重置成功后的重定向地址 /home,而由于我们在本项目中并没有为 /home 绑定任何控制器动作,因此我们需要对 ResetPasswordController 的 $redirectPath 属性进行修改,将默认重定向地址改为 /,改动后的 ResetPasswordController 如下:
app/Http/Controllers/Auth/ResetPasswordController.php
middleware('guest');
}
}
定制 Laravel 密码重置邮件功能
生成消息通知文件
$ php artisan make:notification ResetPassword
以上命令会生成 app/Notifications/ResetPassword.php
文件;
定制消息通知文件
app/Notifications/ResetPassword.php
token = $token;
}
public function via($notifiable)
{
return ['mail'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->line('这是一封密码重置邮件,如果是您本人操作,请点击以下按钮继续:')
->action('重置密码', url(config('app.url').route('password.reset', $this->token, false)))
->line('如果您并没有执行此操作,您可以选择忽略此邮件。');
}
}
User 模型里调用通知
app/Models/User.php
notify(new ResetPassword($token));
}
}
发布密码重置的 Email 视图
$ php artisan vendor:publish --tag=laravel-notifications
发布的文件为 resources/views/vendor/notifications/email.blade.php
,这里我们先不做修改。
尝试邮箱找回密码功能
点忘记密码开始测试,在 storage/logs/laravel.log 文件中打开重置密码链接……