如何自定义Laravel Fortify(v8)的密码重置逻辑
修改Laravel Fortify密码重置用户检索逻辑
针对你的需求,要让Fortify在密码重置时仅匹配user_type为creator的用户记录,以下是两种直接可行的实现方案:
方案一:直接覆盖Fortify密码重置处理逻辑
在App\Providers\FortifyServiceProvider的boot方法中,自定义密码重置的完整处理流程,明确指定用户查询条件:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Password; use Illuminate\Auth\Events\PasswordReset; use Laravel\Fortify\Fortify; public function boot() { // 保留原有Fortify配置... Fortify::resetPasswordsUsing(function (Request $request) { $credentials = $request->only('email', 'password', 'password_confirmation', 'token'); // 核心修改:仅查找email匹配且user_type为creator的用户 $user = \App\Models\User::where('email', $request->email) ->where('user_type', 'creator') ->first(); if (!$user) { return back()->withErrors(['email' => trans('passwords.user')]); } $response = Password::reset( $credentials, function ($user, $password) { $user->forceFill([ 'password' => Hash::make($password) ])->save(); event(new PasswordReset($user)); } ); return $response == Password::PASSWORD_RESET ? redirect()->route('login')->with('status', __($response)) : back()->withErrors(['email' => __($response)]); }); }
方案二:底层重写密码Broker的用户检索逻辑
如果希望在更底层统一修改密码重置的用户匹配规则,可自定义密码Broker:
- 在
App\Providers\AuthServiceProvider的boot方法中扩展默认密码Broker:
use Illuminate\Support\Facades\Auth; use Illuminate\Auth\Passwords\PasswordBroker; public function boot() { $this->registerPolicies(); Auth::broker()->extend('creator-only', function ($app, $config) { $broker = new PasswordBroker( $app['auth.password.tokens'], $app['auth']->createUserProvider($config['provider']), $app['mailer'], $config['email'] ); // 重写用户解析逻辑,添加user_type条件 $broker->setUserResolver(function ($credentials) { return \App\Models\User::where('email', $credentials['email']) ->where('user_type', 'creator') ->first(); }); return $broker; }); }
- 修改
config/fortify.php配置,指定密码重置使用自定义Broker:
'passwords' => 'creator-only',
注意事项
- 测试时需验证:当同一邮箱存在
creator和player两条记录时,仅creator账号的密码会被重置 - 可在密码重置页面添加提示,明确告知用户此流程仅适用于创作者账号
内容的提问来源于stack exchange,提问作者b4tch
相关产品推荐
相关产品推荐

