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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:25:15