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

3
我有一个UsersController和edit.ctp视图。当我浏览/users/edit/1时,我看到密码字段填充了*****(在User.php实体中使用DefaultPasswordHasher的哈希值填充)。我的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');

如果我尝试从控制器中留空,就会出现错误;如果我尝试填写实际密码,它会再次哈希。我该如何编辑任何用户而不更改其密码?我可以在模型中设置还是需要将密码设置为非必需的?管理员不需要查看真实密码,我已经对密码确认进行了验证(已经起作用)。在add.ctp中没有问题,因为默认值始终为空白。我只想在填写密码字段时才更改密码。我认为“密码”需要在模型中为“必需”,因为所有用户都需要密码,这就是为什么我试图将其与控制器中的验证保持一定距离的原因。验证说“在创建时”,但即使在更新时也是必需的,可能存在错误吗?我的Cake版本是3.4.4。预先感谢您。
1个回答

4

有几件事情需要注意:

首先,如果您尚未这样做,您可能需要将密码字段标记为隐藏,以防止在toArray调用或JSON视图中显示哈希值。

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

如果您使用debug($user)查看实体,就会注意到它跟踪哪些字段是“脏”的。由于patchEntity看到您提交了一个密码字段(即使它是空的),它将User实体的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);

谢谢!它起作用了,我已经在patchEntity之前更新了unset,在我的debug(user)中只出现了“dirty”password_confirm(我认为这很奇怪),但是通过这一切按计划进行了。我在Entity 'password'和'token'中使用了_hidden,并在表单密码中将值设置为''(token确实无关紧要)。祝你有愉快的一天 :) - Marco C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接