如何在Laravel中判断数据库用户密码是否为空并将状态传递给Vue应用
问题根因
Laravel 的 User 模型默认会将 password、remember_token 等敏感字段加入模型的$hidden属性中,当模型被序列化为数组或 JSON 返回时,$hidden 列表内的字段会被自动移除,因此前端收到的响应数据中不存在 password 字段,访问时自然返回 undefined。
最优解决方案(推荐,无敏感信息泄露风险)
不需要返回密码哈希值,只需在模型中新增自定义访问器,返回标识用户是否设置密码的布尔字段即可,操作步骤如下:
- 打开
app/Models/User.php文件,修改模型配置:
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; // 原有配置,默认就包含password在hidden数组 protected $hidden = [ 'password', 'remember_token', ]; // 新增:将自定义字段加入序列化返回列表 protected $appends = ['has_password']; // 新增:自定义访问器,判断是否设置密码 public function getHasPasswordAttribute() { return !is_null($this->password); } // 其余原有代码保持不变 }
- 控制器原有代码无需修改,前端直接访问返回的用户对象的
has_password字段即可:
axios.get('/admin/user') .then(function (response) { self.users = response.data; for(var i=0; i<self.users.length; i++) { // true 代表已设置密码,false 代表未设置密码 console.log(self.users[i].has_password) } }) .catch(function (error) { console.log(error); });
临时方案(不推荐,存在敏感信息泄露风险)
如果确实需要直接返回密码哈希值,可以在控制器查询时临时将password字段设为可见:
public function get() { $users = User::get()->makeVisible('password'); return response($users, 200); }
该方案会将密码哈希值直接返回给前端,哈希值虽无法直接逆推出明文,但仍存在被暴力破解的风险,非必要不建议使用。
内容的提问来源于stack exchange,提问作者moin205
相关产品推荐
相关产品推荐

