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
相关产品推荐
相关产品推荐

