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

