Laravel8更新密码时出现SessionGuard::admin不存在错误
Laravel 8 管理员密码更新报错:Method Illuminate\Auth\SessionGuard::admin does not exist
在Laravel 8框架中更新管理员密码时触发该错误,核心原因是错误调用了不存在的admin()方法来获取管理员信息,以下是详细配置、错误代码及解决方案:
项目认证配置(auth.php)
<?php return [ /* |-------------------------------------------------------------------------- | 认证默认设置 |-------------------------------------------------------------------------- */ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], /* |-------------------------------------------------------------------------- | 认证守卫 |-------------------------------------------------------------------------- */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], /* |-------------------------------------------------------------------------- | 用户提供者 |-------------------------------------------------------------------------- */ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ], /* |-------------------------------------------------------------------------- | 密码重置 |-------------------------------------------------------------------------- */ 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], 'admins' => [ 'provider' => 'admins', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], /* |-------------------------------------------------------------------------- | 密码确认超时时间 |-------------------------------------------------------------------------- */ 'password_timeout' => 10800, ];
错误的控制器代码(Admin控制器UpdatePassword方法)
public function UpdatePassword(Request $request) { $request->validate([ 'old_password' => 'required', 'new_password' => 'required|confirmed', ]); if(!Hash::check($request->old_password, auth()->admin()->password)){ return back()->with("error", "旧密码不匹配!"); } // 注释中的代码同样存在错误:Auth::Admin() 写法不正确 // $hashedPassword = Auth::Admin()->password; // if(Hash::check($request->old_password, $hashedPassword)){ // $admin = Admin::find(Auth::id()); // $admin->password = Hash::make($request->new_password); // $admin->save(); // Auth::Logout(); // return redirect('admin')->with('status', '密码修改成功!'); // } // else{ // return redirect()->back()->with('error', '操作出错!'); // } // return redirect()->back()->with('status', '密码修改成功!'); }
错误分析与解决方案
错误根源
auth()->admin()是错误写法:Laravel的SessionGuard类没有admin()方法,默认auth()调用的是web守卫,要获取管理员信息,需要明确指定使用admin守卫。
修正后的完整代码
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; public function UpdatePassword(Request $request) { $request->validate([ 'old_password' => 'required', 'new_password' => 'required|confirmed', ]); // 获取当前登录的管理员(指定admin守卫) $admin = Auth::guard('admin')->user(); // 验证旧密码 if (!Hash::check($request->old_password, $admin->password)) { return back()->with("error", "旧密码不匹配!"); } // 更新密码 $admin->password = Hash::make($request->new_password); $admin->save(); // 登出管理员并跳转 Auth::guard('admin')->logout(); return redirect('admin')->with('status', '密码修改成功!'); }
关键修正点
- 使用
Auth::guard('admin')->user()或auth('admin')->user()获取当前登录的管理员,而非auth()->admin() - 登出时需指定
admin守卫,避免默认登出web守卫的用户 - 无需重新查询管理员模型,直接使用守卫返回的用户实例即可更新
内容的提问来源于stack exchange,提问作者MD. RONY AHMED
相关产品推荐
相关产品推荐

