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

Laravel Auth::attempt()报错:使用自定义密码字段时提示“Unknown column 'password'”

Laravel Auth::attempt()报错:使用自定义密码字段时提示“Unknown column 'password'”

兄弟,我之前从CI迁Laravel做多Guard登录的时候也踩过一模一样的坑!你遇到的问题本质就是Laravel的Auth组件默认认死了password字段,没告诉它要改用你的admin_user_password,所以才会报找不到password列的错,还有哈希验证不匹配的问题,我给你一步步捋清楚怎么解决:

1. 先把config/auth.php配置对(核心!)

首先得给你的后台用户单独配一个Guard和对应的Provider,明确告诉Laravel用哪个表/模型,还有自定义的密码字段:

打开config/auth.php,找到guards数组,添加你的admin Guard:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    // 新增后台用户的Guard
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins', // 这个Provider后面要配置
    ],
],

然后找到providers数组,添加admins的配置,分两种常用情况:

情况一:用Database驱动(直接操作表,不用模型)

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
    // 新增后台用户的Provider
    'admins' => [
        'driver' => 'database',
        'table' => 'tbl_admin_user', // 你的自定义表名
        'password' => 'admin_user_password', // 重点!指定密码字段
    ],
],

情况二:用Eloquent驱动(推荐,更灵活)

先创建对应的后台用户模型,再配置Provider:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\AdminUser::class, // 你的自定义模型
    ],
],

2. 自定义AdminUser模型(用Eloquent驱动的话)

如果用Eloquent,模型里要指定表名,还要重写Laravel默认的密码获取方法:

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class AdminUser extends Authenticatable
{
    // 指定你的自定义表名
    protected $table = 'tbl_admin_user';

    // 重写获取认证密码的方法,返回你的自定义密码字段
    public function getAuthPassword()
    {
        return $this->admin_user_password;
    }

    // 可选:如果要让Auth自动识别你的自定义邮箱字段,也可以重写这个方法
    public function getAuthIdentifierName()
    {
        return 'admin_user_email_id';
    }
}

3. 正确调用Auth::attempt()

两个绝对不能忘的点:

  • 必须指定用admin这个Guard,不然会默认用web Guard去查users表
  • 传的验证数组里,密码的键用password(传明文!),Laravel会自动拿这个明文和数据库里的admin_user_password哈希值做对比

示例代码:

// 从请求里获取邮箱和密码
$credentials = [
    'admin_user_email_id' => $request->email, // 对应表的邮箱字段
    'password' => $request->password // 这里直接传明文,别自己哈希!
];

// 用admin Guard尝试登录
if (Auth::guard('admin')->attempt($credentials)) {
    // 登录成功,跳转到后台首页之类的
    return redirect()->intended('/admin/dashboard');
} else {
    // 登录失败,返回错误提示
    return back()->withErrors(['email' => '邮箱或密码错误']);
}

关于你提到的两个额外问题:

  • 为什么会跑update查询?:大概率是Laravel的Authenticatable模型默认开启了timestamps,登录成功后会更新last_login_at这类字段(如果你的表有这个字段的话),或者是你自己的登录逻辑里加了更新操作,解决上面的配置后这个问题会跟着正常。
  • 哈希密码不匹配?:百分百是你手动给密码做了哈希再传给attempt()!记住,attempt()会自动用Hash::check()把你传的明文密码和数据库里的哈希值对比,如果你先哈希再传,相当于把哈希后的字符串又哈希了一次,肯定和数据库里的不一样,直接传明文就好!

备注:内容来源于stack exchange,提问作者Manish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:38:02