Laravel postRegister函数中管理员用户认证失败问题排查
核心原因
从你提供的代码来看,导致认证失败的主要问题有两个:
密码加密方式不匹配
Laravel的认证系统默认使用bcrypt哈希算法验证密码,但你在创建AdminUser时用了md5($request->password)存储密码,Auth::attempt()会自动用bcrypt验证输入的明文密码,两者哈希结果不一致,导致认证失败。未指定管理员专属认证Guard
你的config/auth.php里配置了admin和admin-api两个针对AdminUser的Guard,但默认Guard是web(对应普通用户的User模型)。调用Auth::attempt()时没有指定Guard,系统会用默认的webGuard去User模型里查找用户,自然找不到刚创建的AdminUser。
另外还有一个潜在问题:$user = $user->save()会把$user变量变成布尔值(save()返回成功/失败状态),后续调用$user->createToken()会直接报错,需要修正赋值逻辑。
具体排查与修复步骤
修正密码加密逻辑
替换创建用户时的密码赋值代码,使用Laravel官方推荐的哈希方式:// 方式1:直接在创建时加密 $user = new AdminUser([ 'name'=>$request->name, 'email'=>$request->email, 'password'=>Hash::make($request->password) // 替换原md5加密 ]); // 方式2:在AdminUser模型中添加自动加密的属性访问器(更规范) public function setPasswordAttribute($value) { $this->attributes['password'] = Hash::make($value); }方式2配置后,创建用户时只需传入明文密码,模型会自动加密存储。
指定认证Guard
在调用Auth::attempt()时明确指定管理员Guard:$credentials = ['email'=>$request->email, 'password'=>$request->password]; // 后台会话认证用admin Guard if (!Auth::guard('admin')->attempt($credentials)) { return response()->json(['message' => 'Can not Login'], 401); } // 如果是API接口认证,用admin-api Guard // if (!Auth::guard('admin-api')->attempt($credentials)) { ... }修复用户变量赋值错误
创建用户后不要覆盖$user变量:$user = new AdminUser([ 'name'=>$request->name, 'email'=>$request->email, 'password'=>Hash::make($request->password) ]); $user->save(); // 不要写成$user = $user->save();验证Guard与Provider配置
确认config/auth.php中:adminGuard的provider是admin_usersadmin_usersProvider的model指向App\Models\AdminUser::class
你的配置已经正确,但要确保代码中使用了对应的Guard。
检查Passport初始化状态
确保已经执行过Passport的安装命令:php artisan passport:install并且在
AuthServiceProvider中注册了Passport路由:use Laravel\Passport\Passport; public function boot() { $this->registerPolicies(); Passport::routes(); }
内容的提问来源于stack exchange,提问作者RCeyda

