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

时间:2017-04-18 22:53:33

标签: forms validation model cakephp-3.0

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

所以,我可以试试:

unset($user->password); // in edit() from UsersController.php

并设置[require => false]在edit.ctp中

当我保存时,我得到了

The user could not be saved. Please, try again.

因为在我的UsersTable.php中我有:

$validator
    ->requirePresence('password', 'create')
    ->notEmpty('password');

如果我试图从控制器留空,我会收到错误,如果我尝试填写实际密码,它会再次出现哈希值。

如何在不更改密码的情况下编辑任何用户?我可以从模型中设置它,还是需要输入密码?

  • 我不需要向管理员显示真实密码
  • 我从控制器验证password_confirm(已经有效)
  • 在add.ctp中没有问题,因为默认值始终为空白
  • 我只想在填写密码字段时更改密码
  • 我认为模型中的密码需要必需,因为所有用户都需要他们的密码,这就是为什么我试图将其远离控制器中的验证
  • 验证说"创建"但即使需要更新,bug也可能吗?
  • 我的蛋糕版本是3.4.4

提前致谢

1 个答案:

答案 0 :(得分:2)

一些事情:

首先,如果您还没有,则可能需要将密码字段标记为hidden ,以防止它在toArray来电中公开哈希或JSON视图。

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

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

您可以使用$export->setDirty('password', false);标记字段清洁,但是当在表单中提交新密码时,它将无法保存。

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

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