Laravel使用email和google_password登录报'Undefined array key "password"'错误解决
解决Laravel自定义密码字段登录的"Undefined array key 'password'"错误
错误原因
Laravel默认的Auth::attempt()方法会自动寻找数组中的password键,并与用户模型的password字段(通过getAuthPassword()方法获取)比对。你传入的是google_password键,而默认逻辑仍在查找password,因此触发该错误。
解决方案
方法一:重写用户模型的getAuthPassword()方法
这是最简洁的实现方式,让Laravel认证时使用google_password作为密码验证字段:
- 在
App\Models\User.php模型中添加以下方法:
/** * Get the password for the user. * * @return string */ public function getAuthPassword() { return $this->google_password; }
- 修改
Auth::attempt()的调用参数,将google_password改为password,同时修复原代码的缩进逻辑:
$password = randomPassword(); if(isset($user)){ $users = User::find($user->id); $users->google_password = Hash::make($password); $users->save(); if(Auth::attempt(['email' => $googleUser->email, 'password' => $password])) { session()->regenerate(); DB::table('login_log')->insert([ 'user_id' => Auth::user()->id, 'time' => date('Y-m-d H:i:s'), 'source' => 'Google' ]); return redirect()->intended($intendedUrl); } else { return redirect()->intended($intendedUrl); } }
方法二:自定义认证守卫(适合多登录场景)
如果需要同时支持默认密码登录和Google密码登录,可自定义认证守卫:
- 打开
config/auth.php,在guards数组中添加自定义守卫:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // Google登录专属守卫 'google' => [ 'driver' => 'session', 'provider' => 'google_users', ], ],
- 在
providers数组中添加对应的用户提供者,指定密码字段为google_password:
'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // Google用户提供者 'google_users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, 'password' => 'google_password', ], ],
- 使用自定义守卫完成认证:
$password = randomPassword(); if(isset($user)){ $users = User::find($user->id); $users->google_password = Hash::make($password); $users->save(); if(Auth::guard('google')->attempt(['email' => $googleUser->email, 'password' => $password])) { session()->regenerate(); DB::table('login_log')->insert([ 'user_id' => Auth::guard('google')->user()->id, 'time' => date('Y-m-d H:i:s'), 'source' => 'Google' ]); return redirect()->intended($intendedUrl); } else { return redirect()->intended($intendedUrl); } }
额外提示
- 确保
users表中已存在google_password字段,且代码中Hash::make($password)的哈希存储逻辑正确。 - 原代码中
session()->regenerate()和登录日志插入未包裹在if大括号内,会导致无论认证成功与否都会执行,必须修正缩进和大括号。
内容的提问来源于stack exchange,提问作者Laravel coder
相关产品推荐
相关产品推荐

