Forms CakePHP 3如何在不更改密码的情况下编辑用户(哈希)

Forms CakePHP 3如何在不更改密码的情况下编辑用户(哈希),forms,validation,model,cakephp-3.0,Forms,Validation,Model,Cakephp 3.0,我有我的UsersController和我的edit.ctp视图。当我浏览/users/edit/1时,我看到密码字段填充了****(在entity User.php中使用DefaultPasswordHasher填充了哈希)。My UsersTable.php具有所需的密码 因此,我可以尝试: unset($user->password); // in edit() from UsersController.php 并在edit.ctp中设置[require=>false] 当我存钱的

我有我的UsersController和我的edit.ctp视图。当我浏览/users/edit/1时,我看到密码字段填充了****(在entity User.php中使用DefaultPasswordHasher填充了哈希)。My UsersTable.php具有所需的密码

因此,我可以尝试:

unset($user->password); // in edit() from UsersController.php
并在edit.ctp中设置[require=>false]

当我存钱的时候,我得到了钱

The user could not be saved. Please, try again.
因为在我的UsersTable.php中,我有:

$validator
    ->requirePresence('password', 'create')
    ->notEmpty('password');
若我试图在控制器中留空,我会得到错误,若我试图用实际密码填充,它会再次散列

如何编辑任何用户而不更改其密码?我可以从模型中设置此项,还是需要设置不需要的密码

  • 我不需要向管理员显示真实密码
  • 我从控制器验证密码\u确认(已生效)
  • 在add.ctp中没有问题,因为默认值始终为空
  • 仅当密码字段已填充时,我才想更改密码
  • 我认为在模型中,密码必须是必需的,因为所有用户都需要他们的密码,这就是为什么我试图在控制器中远离验证的原因
  • 验证说明“创建时”,但即使需要更新,也可能出现错误
  • 我的蛋糕版本是3.4.4
提前感谢

两件事:

首先,如果您还没有,您可能希望将密码字段标记为,以防止它在
数组
调用或JSON视图中暴露哈希

其次,提供给patchEntity的任何数据字段都将被验证并保存(正如您所发现的),即使该字段的值为空

如果使用
debug($user)
查看实体,您会注意到它跟踪哪些字段是“脏的”,并且由于patchEntity看到您提交了一个密码字段(即使它是空的),它将用户实体的
密码设置为空,并将其标记为“脏的”。即使您稍后调用
unset($user->password)
它仍然有一个脏的记录,因此它将尝试验证它的值

您可能会使用
$export->setDirty('password',false)将字段标记为clean
但是当以表单形式提交新密码时,它将不会被保存

更好的选择是在调用patchEntity之前检查密码字段是否为空,然后将其取消设置

if($this->request->is(['patch','post','put'])){
$data=$this->request->getData();
if(空($data['password'])){
未设置($data['password']);
}
$user=$this->Users->patchEntity($user,$data);

谢谢!这很有效,我已经在patchEntity之前更新了unset,在我的调试中(用户)只显示为“脏”密码\u确认(我觉得很奇怪),但由于所有这些都按计划工作,我已经在实体“password”和“token”中隐藏了,我已经在表单password(token)中为“”添加了值。祝您愉快:)