2017-04-18 56 views
1

我有我的用户控制器与我的edit.ctp视图。当我浏览/ users/edit/1时,我看到填充了*****的密码字段(在实体User.php中填充了哈希值,使用DefaultPasswordHasher)。我的UsersTable.php有需要的密码。CakePHP 3如何在不更改密码的情况下编辑用户(散列)

所以,我可以试试:

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

,并设置[要求=>假]在edit.ctp

当我保存,我得到

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

因为在我UsersTable .php我有:

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

如果我试图从控制器留空白我得到错误,如果我尝试填充实际的密码,它再次哈希。

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

  • 我不需要表现出真正的密码向管理员
  • 我从控制器验证了password_confirm(已工作)
  • 在add.ctp是没有问题的,因为默认值始终是空白
  • 我想更改密码只有在密码字段填
  • 我想密码必须需要的模式,因为所有用户都需要自己的密码,这就是为什么我试图保持它远没有在控制器验证
  • 验证说“在创建”,但即使在更新是必要的,错误可能吗?
  • 我的蛋糕的版本是提前3.4.4

感谢

回答

1

几件事情:

首先,如果你还没有准备好,你可能要标记的密码字段hidden以防止它在调用或JSON视图中暴露toArray中的散列。

其次,提供给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); 
+0

谢谢!它的工作原理,我更新了patchEntity之前未设置,在我的调试(用户)只显示为“脏”password_confirm(我认为是奇怪的),但这一切都按计划运作,我已经_隐藏在实体'密码'和'令牌',我已经以形式密码的形式赋予了''的价值(令牌无关紧要)。祝你今天愉快 :) –

相关问题