Laravel 8中管理员与用户自定义密码重置跳转异常问题
问题根源
两个路由使用了相同的名称password.reset,Laravel中路由名称是全局唯一的,后定义的路由会覆盖先定义的,所以生成密码重置链接时,只会指向最后注册的那个路由(也就是用户端的/reset-password/{token})。
解决方案
1. 修改管理员路由的名称
给管理员的密码重置路由设置唯一名称,比如admin.password.reset:
Route::get('/skc-admin/reset-password/{token}', function ($token) { return view('admin/reset-password', ['token' => $token]); })->middleware('guest')->name('admin.password.reset');
2. 配置管理员专属的认证Guard与密码Broker
在config/auth.php中添加管理员的认证配置:
// guards 数组中添加 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], // providers 数组中添加 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, // 替换为你的管理员模型 ], // passwords 数组中添加 'admins' => [ 'provider' => 'admins', 'table' => 'password_resets', // 可复用现有表或新建专属表 'expire' => 60, ],
3. 创建管理员专属的忘记密码控制器
新建App\Http\Controllers\Admin\AdminForgotPasswordController.php,重写密码重置链接生成逻辑:
namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\SendsPasswordResetEmails; class AdminForgotPasswordController extends Controller { use SendsPasswordResetEmails; // 指定管理员密码重置的Broker public function broker() { return \Password::broker('admins'); } // 生成管理员专属的重置链接 protected function resetPasswordUrl($user) { return route('admin.password.reset', ['token' => \Password::createToken($user)]); } }
4. 配置管理员的忘记密码路由
在web.php中添加管理员的忘记密码请求与提交路由:
// 管理员忘记密码页面 Route::get('/skc-admin/forgot-password', function () { return view('admin/forgot-password'); })->middleware('guest')->name('admin.password.request'); // 管理员发送重置邮件 Route::post('/skc-admin/forgot-password', [\App\Http\Controllers\Admin\AdminForgotPasswordController::class, 'sendResetLinkEmail']) ->middleware('guest') ->name('admin.password.email');
5. 配置管理员的密码重置提交路由
添加管理员的密码重置提交路由,确保使用管理员的Broker处理重置逻辑:
Route::post('/skc-admin/reset-password', function (\Illuminate\Http\Request $request) { $request->validate([ 'token' => 'required', 'email' => 'required|email', 'password' => 'required|min:8|confirmed', ]); $status = \Password::broker('admins')->reset( $request->only('email', 'password', 'password_confirmation', 'token'), function ($user, $password) { $user->forceFill([ 'password' => bcrypt($password) ])->save(); } ); return $status === \Password::PASSWORD_RESET ? redirect()->route('admin.login')->with('status', __($status)) : back()->withErrors(['email' => __($status)]); })->middleware('guest')->name('admin.password.update');
完成以上配置后,管理员的密码重置邮件会生成指向/skc-admin/reset-password/{token}的链接,不会再跳转到用户端的表单。
内容的提问来源于stack exchange,提问作者Webzy Infotech
相关产品推荐
相关产品推荐

