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

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作为密码验证字段:

  1. 在App\Models\User.php模型中添加以下方法:
/**
 * Get the password for the user.
 *
 * @return string
 */
public function getAuthPassword()
{
    return $this->google_password;
}
  1. 修改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密码登录,可自定义认证守卫:

  1. 打开config/auth.php,在guards数组中添加自定义守卫:
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    // Google登录专属守卫
    'google' => [
        'driver' => 'session',
        'provider' => 'google_users',
    ],
],
  1. 在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',
    ],
],
  1. 使用自定义守卫完成认证:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:08:22