You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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的默认请求:

  1. 创建自定义请求文件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' => '人机验证失败,请重新尝试',
        ];
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:42:08