如何在Laravel Fortify中重写找回密码的验证逻辑?
自定义Laravel Fortify找回密码验证规则及添加reCAPTCHA
要定制Fortify的找回密码验证逻辑,你可以通过以下两种方式实现:
方法一:使用验证回调直接定制逻辑
在App\Providers\FortifyServiceProvider的boot方法中,利用Fortify::validatePasswordResetLinkRequestUsing回调添加自定义验证规则和reCAPTCHA检查:
use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; use App\Models\User; Fortify::validatePasswordResetLinkRequestUsing(function (Request $request) { // 执行自定义验证 $request->validate([ 'email' => 'required|email|exists:users,email|your-custom-email-rule', // 替换为你的邮箱自定义规则 'g-recaptcha-response' => 'required|recaptcha', // Google reCAPTCHA验证规则 ]); // 可添加额外业务检查,比如验证用户是否激活 $user = User::where('email', $request->email)->first(); if (!$user?->is_active) { throw ValidationException::withMessages([ 'email' => ['该账号未激活,请先完成激活再尝试找回密码'], ]); } return true; });
方法二:自定义请求类替换默认验证
如果需要更结构化的扩展,可创建自定义请求类继承Fortify的默认请求:
- 创建自定义请求文件
app/Http/Requests/CustomForgotPasswordRequest.php:
namespace App\Http\Requests; use Laravel\Fortify\Http\Requests\ForgotPasswordRequest as FortifyForgotPasswordRequest; class CustomForgotPasswordRequest extends FortifyForgotPasswordRequest { /** * 自定义验证规则 */ public function rules() { return array_merge(parent::rules(), [ 'email' => 'required|email|exists:users,email|your-custom-email-rule', 'g-recaptcha-response' => 'required|recaptcha', ]); } /** * 自定义验证错误消息(可选) */ public function messages() { return [ 'email.your-custom-email-rule' => '邮箱不符合系统要求', 'g-recaptcha-response.required' => '请完成人机验证', 'g-recaptcha-response.recaptcha' => '人机验证失败,请重新尝试', ]; } }
- 在
FortifyServiceProvider中替换默认请求类:
use App\Http\Requests\CustomForgotPasswordRequest; Fortify::forgotPasswordRequestUsing(function () { return CustomForgotPasswordRequest::class; });
前端添加reCAPTCHA组件
在找回密码的Blade视图中添加reCAPTCHA的HTML代码(以anhskohbo/no-captcha包为例):
<div class="mb-4"> {!! NoCaptcha::display() !!} @error('g-recaptcha-response') <span class="text-red-500 text-sm">{{ $message }}</span> @enderror </div>
注意事项
- 确保已安装并配置reCAPTCHA相关依赖(如
anhskohbo/no-captcha),并在.env中设置NOCAPTCHA_SECRET和NOCAPTCHA_SITEKEY - 若使用reCAPTCHA v3,需调整验证规则为
'g-recaptcha-response' => 'required|recaptcha:3,0.5'(0.5为阈值,可根据需求调整)
内容的提问来源于stack exchange,提问作者Iwalewa Fawaz
相关产品推荐
相关产品推荐

