Laravel 5.5密码重置令牌表单不显示,访问重置URL报错
看起来你遇到的核心问题是:密码重置链接的格式不对,导致路由无法匹配到正确的重置表单页面,反而跳回了邮箱提交页。咱们一步步来排查解决:
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

