UsersTable.php中的CakePHP验证器规则不起作用

时间:2016-05-02 20:50:36

标签: cakephp cakephp-3.0

我正在CakePHP中创建一个更改密码表单,该表单要求用户输入他/她的当前密码,新密码并确认新密码。输入完所有内容后,如果所有条目都遵循设置的验证规则,则会更改用户的密码。

但是,验证规则不起作用。用户不必填写所有字段,将新密码设置为一定长度,确保新密码和确认密码字段匹配等。我似乎无法找出问题所在。

我将在下面提供所有相关代码。谢谢:))

change_password.ctp(视图文件)

<div class="users form large-9 medium-9 columns">
    <?= $this->form->create() ?>
    <fieldset>
        <legend> <?= __('Change Password') ?> </legend>
        <?= $this->Form->input('current_password', ['type' => 'password']) ?>
        <?= $this->Form->input('new_password', ['type' => 'password']) ?>
        <?= $this->Form->input('confirm_new_password', ['type' => 'password']) ?>
    </fieldset>

    <?= $this->Form->button(__('Save')) ?>
    <?= $this->Form->end() ?>
</div>
UsersController中的

changePassword()

public function changePassword()
{
    $user = $this->Users->get($this->Auth->user('id'));
    if (!empty($this->request->data)) {
        $user = $this->Users->patchEntity($user, [
                'password'      => $this->request->data['new_password'],
            ],
            ['validate' => 'password']
        );
        if ($this->Users->save($user)) {
            $this->Flash->success('The password is successfully changed');
            $this->redirect('/users');
        } else {
            $this->Flash->error('There was an error during the save!');
        }
    }
    $this->set('user', $user);
}
UsersTable中的

validationPassword()(即验证规则)

public function validationPassword(Validator $validator )
{
    $validator
        ->add('current_password','custom',[
            'rule'=>  function($value, $context){
                $user = $this->get($context['data']['id']);
                if ($user) {
                    if ((new DefaultPasswordHasher)->check($value, $user->password)) {
                        return true;
                    }
                }
                return false;
            },
            'message'=>'Incorrect Password!',
        ])
        ->notEmpty('current_password');

    $validator
        ->add('new_password', [
            'length' => [
                'rule' => ['minLength', 6],
                'message' => 'The password must be at least 6 characters!',
            ]
        ])
        ->add('new_password',[
            'match'=>[
                'rule'=> ['compareWith','confirm_new_password'],
                'message'=>'The passwords does not match!',
            ]
        ])
        ->notEmpty('new_password');
    $validator
        ->add('confirm_new_password', [
            'length' => [
                'rule' => ['minLength', 6],
                'message' => 'The password must be at least 6 characters!',
            ]
        ])
        ->add('confirm_new_password',[
            'match'=>[
                'rule'=> ['compareWith','new_password'],
                'message'=>'The passwords does not match!',
            ]
        ])
        ->notEmpty('confirm_new_password');

    return $validator;
}

编辑:添加了User.php文件

<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;
use Cake\Auth\DefaultPasswordHasher;
use Cake\Validation\Validator;

/**
 * User Entity.
 *
 * @property int $id
 * @property string $first_name
 * @property string $last_name
 * @property string $email
 * @property string $username
 * @property string $password
 */
class User extends Entity
{

    /**
     * Fields that can be mass assigned using newEntity() or patchEntity().
     *
     * Note that when '*' is set to true, this allows all unspecified fields to
     * be mass assigned. For security purposes, it is advised to set '*' to false
     * (or remove it), and explicitly make individual fields accessible as needed.
     *
     * @var array
     */
    protected $_accessible = [
        '*' => true,
        'id' => false,
    ];

    /**
     * Fields that are excluded from JSON an array versions of the entity.
     *
     * @var array
     */
    protected $_hidden = [
        'password'
    ];

    protected function _setPassword($value) {
        $hasher = new DefaultPasswordHasher();
        return $hasher->hash($value);
    }
}

1 个答案:

答案 0 :(得分:0)

您有字段current_passwordnew_passwordconfirm_new_password的验证规则,但您只需使用patchEntity设置字段密码,这就是为什么此验证程序不是调用。

 public function changePassword()
{
    ...
    $user = $this->Users->patchEntity($user, [
            'password'      => $this->request->data['new_password'], // There is no validator defined for the field 'password'
        ],
        ['validate' => 'password']
    );
    ...
}

在您的情况下,您必须使用

更改您的代码
public function changePassword()
{
    ...
    $user = $this->Users->patchEntity($user, [
            'password'      => $this->request->data['new_password'], // Your actual field in db
            'current_password'  => $this->request->data['current_password'], // Trigger validation rule current_password
            'new_password'  => $this->request->data['new_password'], // Trigger validation rule new_password
            'confirm_new_password'  => $this->request->data['new_password'], // Trigger validation rule confirm_new_password
        ],
        ['validate' => 'password']
    );
    ...
}

在视图文件中,您还忘记将实体作为Form::create()

的第一个参数传递