简介
密码重置是 Web 应用不可或缺的认证流程。使用启动套件时该功能会自动构建,但对于纯 API 项目或自定义 UI 的项目需要手动实现。 需要手动实现的场景:- 仅 API 的后端(前端为 SPA / 移动应用)
- 不使用启动套件,自行构建认证 UI
- 需要完全自定义邮件通知或重置 URL 设计
如果通过启动套件(
laravel new)创建项目,密码重置功能已就绪。本页说明不使用启动套件时的实现方式。配置
密码重置配置在config/auth.php 的 passwords 键中。
driver— 数据存储方式(database或cache)expire— 令牌有效期(分钟),默认 60 分钟throttle— 重发受限前的等待时间(秒)
驱动
database 驱动
默认驱动。将密码重置令牌保存到数据库表password_reset_tokens。该表包含在 Laravel 默认迁移(0001_01_01_000000_create_users_table.php)中。
cache 驱动
cache 驱动将令牌保存到缓存中,无需 password_reset_tokens 表迁移。令牌以用户邮箱为键存储,请注意不要在应用其他位置以邮箱作为缓存键。
store 指定专用缓存,可避免 php artisan cache:clear 时把重置数据一并清除。该值需对应 config/cache.php 中配置的存储名称。
准备模型
要使用密码重置功能,App\Models\User 模型需要两个 trait:
Notifiable— 发送邮件通知所必需CanResetPassword— 提供生成、校验密码重置令牌的方法
Laravel 默认
User 模型已经包含这些 trait。全新安装无需再加。路由实现
密码重置需要 4 个路由。1. 请求重置链接的表单
显示输入邮箱的表单。2. 发送重置链接的处理
接收表单提交,通过Password::sendResetLink() 发送重置邮件。
Password::sendResetLink() 返回状态字符串:
3. 密码重置表单
点击邮件链接后向用户展示新密码输入表单。4. 执行密码重置
接收表单并通过Password::reset() 更新密码。
Password::reset() 的状态常量:
令牌有效期
通过config/auth.php 的 expire 选项以分钟为单位设置令牌有效期,默认 60 分钟。
database 驱动,过期令牌会残留在数据库中。可用以下命令定期清理:
自定义
使用自定义通知
要自定义密码重置邮件,可以在User 模型中重写 sendPasswordResetNotification。
自定义重置链接 URL
在AppServiceProvider 的 boot 方法中使用 ResetPassword::createUrlUsing() 可以修改重置链接 URL。这在需要重定向到 SPA 等另一 origin 的前端时非常有用。
配置可信主机(Trusted Hosts)
密码重置链接使用 HTTP 请求的Host 头生成。为防止不良主机导致的问题,建议在 bootstrap/app.php 中配置可信主机。
小结
下一步
认证入门
学习 Laravel 认证系统整体机制。
通知
详细了解如何自定义邮件通知。