Friday, November 14, 2014

Re: cakePHP3 password confirmation

Here is how I did it in Cake 3:

In the User Entity,
 make sure the $accessible list contains the confirm_password whether you store it in the Db or not... and that you use the setPassword method to hash your password when setting it.

protected $_accessible = [
        'username' => true,
        'password' => true,
        'confirm_password' => true,
        'role' => true,
        'email' => true,];
    protected function _setPassword($password) {
       
        return (new DefaultPasswordHasher)->hash($password);
    }
    protected function _setConfirmPassword($password) {
       
        return (new DefaultPasswordHasher)->hash($password);
    }

In your Model usersTable:
add the following in your chain of validations in your validator:
->add('password','custom',['rule'=> function($value, $context){
                    if(isset($context->data['confirm_password']) && $value != $context->data['confirm_password']){
                        return false;
                }
                return true;
            },    'message'=>"Your password does not match your confirm password.  Please try again",    'on'=> ['create','update'],'allowEmpty'=>true])

Then as long as you create the form in your view containing both the password and confirm_password, the validation will work.




On Friday, November 14, 2014 9:14:57 PM UTC+7, Alain Bonnefoy wrote:
Hello,

I tried to implement password confirmation on user registration in cakePHP 3 application.

I did it in cakePHP 2 but it seems quite different here. It seems I can't get my validation function being called.

In the form created below, username and password come form users table.
password is just here for verification and all other fields come from owner table.

/**
 * OwnersController/Add method
 *
 * @return void
 */

   
public function add() {
        $this
->loadModel('Users');

        $user
= $this->Users->newEntity($this->request->data);
        $owner
= $this->Owners->newEntity($this->request->data);

       
if ($this->request->is('post')) {

           
if ($this->Owners->validate($owner) && $this->Users->validate($user)) {
               
if ($this->Owners->save($owner)) {
                    $user
['owner_id'] = $owner['id'];
                    $user
['email'] = $owner['email'];
                    $user
['role'] = 'owner';
                    $user
['active'] = '1';
                    $user
['token'] = md5(time() . '-' . uniqid());

                   
if ($this->Users->save($user)) {
                        $this
->Flash->success(__("Merci de vous être enregistré. un email a été envoyé à {0} pour activer votre compte", $owner['email']));
                       
return $this->redirect(['action' => 'index']);
                   
}
               
}
                debug
($owner); debug($user); die();
                $this
->Flash->error(__("Impossible de vous enregistrer, veuillez corriger les erreurs"));
           
} else {
                $this
->Flash->error(__("Impossible de vous enregistrer, veuillez corriger les erreurs"));
                debug
($owner); debug($user); debug($this->request->data);
           
}
       
}
        $this
->set(compact('owner'));
   
}


In the code above, I always end in else

add.ctp
<div class="container-fluid">
   
<div class="row">
       
<div class="col-md-9">
           
<h1><?= __("Création d'un nouveau propriétaire") ?></h1>
           
<p>&nbsp;</p>
           
<div class="col-md-19 col-md-offset-2 container-fluid well">
               
<?= $this->Form->create($owner) ?>
                   
<fieldset>
                       
<div class="form-group">
                           
<?= $this->Form->input('username', array('label' => __("Nom d'utilisateur :"), 'class' => 'form-control', 'placeholder' => __("Nom d'utilisateur"))); ?>
                       
</div>
                       
<div class="form-group">
                           
<?=  $this->Form->input('password', array('label' => __("Mot de passe :"), 'class' => 'form-control', 'placeholder' => __("Mot de passe"))); ?>
                       
</div>
                       
<div class="form-group">
                           
<?=  $this->Form->input('password2', array('label' => __("Confirmation de mot de passe :"), 'type' => 'password', 'class' => 'form-control', 'placeholder' => __("Confirmation de mot de passe"))); ?>
                       
</div>
                       
<div class="form-group">
                           
<?= $this->Form->input('company', array('label' => __("Société :"), 'class' => 'form-control', 'placeholder' => __("Société"))); ?>
                       
</div>
                       
<div class="form-group">
                           
<?= $this->Form->input('first_name', array('label' => __("Prénom :"), 'class' => 'form-control', 'placeholder' => __("Prénom"))); ?>
...

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

No comments: