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

Laravel8+Ajax实现DataTable展示加密密码的报错解决问题

问题根因

Laravel的App\Models\User模型默认会将password、remember_token字段加入$hidden属性数组,模型序列化输出时会自动隐藏这两个字段,所以你返回给DataTable的数据源里根本没有password字段,前端配置了要取data: 'password'就触发了参数不存在的报错。

解决方案

根据你的实际业务需求选择对应方案即可:

场景1:不需要展示/使用密码字段(最优方案)

加密后的密码哈希本身没有业务展示价值,还会增加敏感数据泄露风险,直接删掉前端columns里的password相关配置即可解决报错:

// 删除这段配置即可
{
    data:'password',
    name: 'password',
    type: "password",
    "visible": false
},

场景2:确实需要获取加密后的密码哈希(比如编辑用户逻辑需要用到)

两种实现方式二选一即可:

方法1:临时移除User模型的password隐藏属性

在查询User数据前调用makeVisible方法临时放开隐藏限制,修改控制器中的查询代码:

return datatables()->of(User::makeVisible('password')->leftjoin('role_user','users.id','=','role_user.user_id')->leftjoin('roles','roles.id','=','role_user.role_id')->leftjoin('filiales','filiales.id_filiale','=','users.id_filiale')->get())
// 后续的addColumn、rawColumns等逻辑保持不变

方法2:手动添加password字段返回

不想修改模型可见性的话,也可以用datatable的addColumn方法手动注入密码字段:

return datatables()->of(User::leftjoin('role_user','users.id','=','role_user.user_id')->leftjoin('roles','roles.id','=','role_user.role_id')->leftjoin('filiales','filiales.id_filiale','=','users.id_filiale')->get())
->addColumn('password', function($user){
    return $user->password;
})
// 后续的action列添加、rawColumns等逻辑保持不变
注意事项
  • 加密后的密码哈希属于敏感数据,哪怕前端设置了visible: false也会存在于接口响应中,有被抓包泄露的风险,非必要不要返回该字段。
  • 绝对不要在前端解密用户密码,也不要明文传输/存储密码,所有密码校验逻辑必须放在服务端执行。

内容的提问来源于stack exchange,提问作者saadia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:09:03