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

Laravel 5.5密码重置令牌表单不显示,访问重置URL报错

解决Laravel 5.5后台密码重置链接无法加载重置表单的问题

看起来你遇到的核心问题是:密码重置链接的格式不对,导致路由无法匹配到正确的重置表单页面,反而跳回了邮箱提交页。咱们一步步来排查解决:

1. 先看路由定义的问题

你用了administrator前缀的路由组,但大概率是重置页面的路由没定义对。正确的后台密码重置路由应该是这样的(把所有相关路由都放进前缀组里):

Route::group(['prefix' => 'administrator'], function () {
    // 邮箱提交表单页
    Route::get('password/reset', 'Admin\ForgotPasswordController@showLinkRequestForm')->name('admin.password.request');
    // 发送重置链接的接口
    Route::post('password/email', 'Admin\ForgotPasswordController@sendResetLinkEmail')->name('admin.password.email');
    // 关键:带token参数的密码重置表单页(必须是路径参数,不是查询参数)
    Route::get('password/reset/{token}', 'Admin\ResetPasswordController@showResetForm')->name('admin.password.reset');
    // 提交重置密码的接口
    Route::post('password/reset', 'Admin\ResetPasswordController@reset')->name('admin.password.update');
});

你的错误URL是.../password/reset?xxxx,但Laravel默认需要的是.../password/reset/xxxx(token是路径参数),所以路由匹配失败,才会跳回默认的邮箱提交页。

2. 修正控制器里的路由生成逻辑

Laravel自带的ForgotPasswordController默认会用password.reset这个路由名生成链接,但咱们后台用了自定义的admin.password.reset,所以需要在后台的ForgotPasswordController里重写生成链接的方法:

namespace App\Http\Controllers\Admin;

use Illuminate\Foundation\Auth\ForgotPasswordController as BaseForgotPasswordController;
use Illuminate\Support\Facades\Password;

class ForgotPasswordController extends BaseForgotPasswordController
{
    // 指定后台的认证guard
    protected $guard = 'admin';

    // 重写重置链接生成方法,用咱们自定义的路由名
    protected function sendResetLinkResponse($response)
    {
        return back()->with('status', trans($response));
    }

    // 指定后台的密码重置broker(需要在config/auth.php里配置)
    public function broker()
    {
        return Password::broker('admins');
    }

    // 关键:重写生成重置链接的逻辑
    protected function resetPasswordLink($user, $token)
    {
        return route('admin.password.reset', ['token' => $token]);
    }
}

同时,后台的ResetPasswordController也要对应配置:

namespace App\Http\Controllers\Admin;

use Illuminate\Foundation\Auth\ResetPasswordController as BaseResetPasswordController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Password;

class ResetPasswordController extends BaseResetPasswordController
{
    protected $guard = 'admin';
    protected $redirectTo = '/administrator'; // 重置成功后跳转的后台地址

    public function guard()
    {
        return Auth::guard('admin');
    }

    public function broker()
    {
        return Password::broker('admins');
    }
}

3. 配置auth.php里的后台认证项

打开config/auth.php,确保后台的guard、provider和password重置配置都正确:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    // 后台guard
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    // 后台用户provider
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class, // 你的后台用户模型
    ],
],

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    // 后台密码重置配置
    'admins' => [
        'provider' => 'admins',
        'table' => 'password_resets', // 可以共用一张表,或者单独建
        'expire' => 60,
    ],
],

4. 验证邮箱模板的链接(如果自定义了模板)

如果你修改了密码重置的邮件模板,要确保里面的链接用的是咱们自定义的路由名:

<a href="{{ route('admin.password.reset', ['token' => $token]) }}">点击重置你的后台密码</a>

做完这些修改后,重新生成密码重置链接,你会得到类似http://localhost/administrator/password/reset/41704c353d33830724d76eefa0702b47201d60fe9957552fdf96e29d7c2cc62a的URL,访问这个地址就能正常加载密码重置表单了。

内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:12:06