[Yii Framework] Update Password With CPasswordHelper

I post this item for answer this question here :https://sabitlabscode.wordpress.com/2013/08/12/yii-framework-use-cpasswordhelper-for-authentication/#comment-2141. So how to update password with CPasswordHelper?

We need to take an action to update password, so create it in controller like this :

 public function actionChangepassword()
    {
        $data=$this->loadModel(Yii::app()->user->id);//get current user that active now

        if(isset($_POST['old'],$_POST['baru1'],$_POST['baru2'])) // if user post to change password
        {
            if($_POST['baru1']!==$_POST['baru2']) // check if it have same password for validation?
            {
                $data->addError('username','Your New Password Not Match'); // if not same, show error
            }
            else // if same, next
            {
                if(CPasswordHelper::verifyPassword($_POST['old'], $data->pass)) // check the old password that user input same with old password?
                {
                    $dua=$_POST['baru1'];
                    $data->pass=CPasswordHelper::hashPassword($_POST['baru1']);// encryp that
                    if($data->save()) // save to tabel
                    {
                        $this->redirect(array('/site'));    
                    }
                }
                else //if password not match with old password, show error
                {
                    $data->addError('username','Wrong Password');
                }
            }
        }

        $this->render('cp',array( //call "cp" view
            'data'=>$data,
        ));
    }

    // function to get a user
    public function loadModel($id)
    {
        $model=User::model()->findByPk($id);
        if($model===null)
            throw new CHttpException(404,'The requested page does not exist.');
        return $model;
    }

After that, we need to create new file for view with name “cp.php” (we call “cp.php” in render, so the name must be match) and insert this code :

 <?php
/* @var $this UserController */
/* @var $model User */

$this->breadcrumbs=array(
    'Change Password',
);

?>

<h1>Change Password</h1>

<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'user-form',
    'enableAjaxValidation'=>true,
)); ?>

    <?php echo $form->errorSummary($data); ?>
    <table>
        <tr>
            <td><?php echo 'Your Current Password :'; ?></td>
            <td>
                <?php echo CHtml::passwordField('old','',array('size'=>50,'maxlength'=>50)); ?>
            </td>
        </tr>
        <tr>
            <td><?php echo 'New Password :'; ?></td>
            <td>
                <?php echo CHtml::passwordField('baru1','',array('size'=>50,'maxlength'=>50)); ?>
            </td>
        </tr>
        <tr>
            <td><?php echo 'Confirmation Your New Password :'; ?></td>
            <td>
                <?php echo CHtml::passwordField('baru2','',array('size'=>50,'maxlength'=>50)); ?>
            </td>
        </tr>
    </table>

    <div>
        <?php echo CHtml::submitButton('Change Password'); ?>
    </div>

<?php $this->endWidget(); ?>
</div><!-- form -->

Finish… hope it help..
happy coding…😀

27 Responses to [Yii Framework] Update Password With CPasswordHelper

  1. danus says:

    apakah ini ada contoh db yh semacam contoh kaya sebelumnya .. yh meskipun ini sambungan dari :https://sabitlabscode.wordpress.com/2013/08/12/yii-framework-use-cpasswordhelper-for-authentication tapi pastikan kalo masih newbie kaya saya pasti bingungkan🙂

  2. danus says:

    saya menemukan cara yg lebih mudah …
    model/user.php

    // hash password
    public function hashPassword($password, $salt)
    {
    return CPasswordHelper::hashPassword($salt.$password);

    }

    //generate salt
    public function generateSalt()
    {
    return uniqid(”,true);
    }

    // password validation
    public function validatePassword($password)
    {
    //return CPasswordHelper::verifyPassword($password,$this->salt)===$this->password;
    return $this->hashPassword($password,$this->salt)===$this->password;
    // return CPasswordHelper::verifyPassword($password,$this->password);

    }

    public function beforeValidate()
    {
    $this->salt = $this->generateSalt();
    return parent::beforeValidate();
    }

    public function beforeSave()
    {
    $this->password = $this->hashPassword($this->password, $this->salt);
    return parent::beforeSave();
    }
    ——————————————————————–
    useridentyti.php

    $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if(!CPasswordHelper::hashPassword($this->password))
    //else if(!$user->validatePassword($this->password))
    $this->errorCode=self::ERROR_PASSWORD_INVALID;
    ——————————————–
    hasilnya
    Username admin1
    Password $2a$13$uuyMFQU/OcNiB/Urlg9syukgMHoecoaY/cLVzHIdl.GCT/cBPUTtC
    Salt 52770f641f7390.90399900
    ————
    dan bisa di update… tampa perlu membuatkan semacam update baru…🙂

    • thanks for share your knowledge, tapi hati2 di code tersebut khusus nya ini :
      public function beforeSave()
      {
      $this->password = $this->hashPassword($this->password, $this->salt);
      return parent::beforeSave();
      }

      ketika agan cuma edit nama user tersebut misal nya, maka password agan akan di rubah juga oleh code tersebut..

  3. danus says:

    kalo update.. nya tinggal modif username .. tinggal edit css

    • bukan gan,

      misal agan nyediain menu untuk update profile (nama, email), bukan update password (jadi inputan utk password tidak ditampilkan). Ketika agan update nama nya dan email nya aja, maka password akan ikut di update dengan password baru nanti nya..

  4. doni says:

    gan numpang tanya kalo buat sms gateway pakek yii gmana ya..
    thanks..
    salam kenal gan..

  5. root12 says:

    ini codenya di simpan dimana ?? di controller apa di model.. ?? biasa di jelasin secara spesifik

  6. root12 says:

    saya jadi galau ?? apakah ‘old’],$_POST[‘baru1’],$_POST[‘baru2’] ??
    misal
    db=> password, salt, jadi old=password, baru1=password dan baru2= salt

    • jadi “old” digunakan untuk ngecek apakah dia benar2 user yang mau ganti password. Sehingga dia harus masukkin password lama nya apa
      “baru1” input password baru
      “baru2” input password baru kembali, memastikan user di password 1 tadi tidak salah ketik. Kalopun salah ketik nanti ketahuan di password 2 jika berbeda

  7. dini says:

    mas.. maaf beda topik nanya nya..

    kalo manggil web service pake yii juga gmna ya cara nya.. kalo yg di blog ini kan manggilnya pake php biasa.. apa ada tutorialnya mas?

  8. root12 says:

    manih admin ? tidur.. kok itu passwordnya gk berubah

  9. dewi says:

    sori saya gk tau koment dimana dan naya pada t4 komen mana saya mau tanya pada http://sirusa.bps.go.id/ kan ada tulisn Hits : 1377->> view counternya make extension apa

  10. dewi says:

    oh .. apakah ane bisa request tutorialnya🙂

    • wah, saya ga sempet juga kalo buat detail. Yang pasti step nya :
      – buat tabel baru khusus nyimpen total view dan apa yang di view
      – tiap user masuk ke suatu kategori, otomatis +1 nilai nya
      – tampilkan

  11. dini says:

    tampilan e harus e kyk gmn mas? kok sya masih sm aja ya? masuk disini http://localhost/grupMerapi3/index.php?r=user/cp juga eror 404

  12. sangprabo says:

    Misal sudah ada field password dengan hash menggunakan md5(), saat ingin menggunakan sistem Yii framework yang baru (menggunakan CPasswordHelper()), berarti kita tidak bisa langsung mengganti dengan hashPassword() karena password aslinya hanya user yang tahu.

    Solusi sementara saat user berhasil login, parameter $_POST password itu kita simpan di field tersendiri sebagai password baru misal password_2 (yang merupakan hash dari CPasswordHelper::hashPassword()), nanti kalau semua user sudah pindah, field password yang lama (yang md5 itu) baru kita hapus. Kalau ada user yang belum login, kita kirimkan email berupa password baru atau perintah untuk mengganti password.

    Saya belum terpikirkan solusi yang lain.. Kira-kira bagaimana ya? Terima kasih.

    • untuk migrasi bisa ditambahkan satu field baru khusus password baru seperti yang agan paparkan tadi. Cara migrasi ga usah suruh user, tapi diam2 disisipkan script di fungsi loginnya. Jadi ketika dia berhasil login, maka dari password hasil inputan login langsung kita save hasil enkripsi nya baru ke dalam database. Juga siapkan fungsi ini ketika change password.
      Kita bisa hapus password lama ketika seluruh user sudah punya password baru.

  13. aldy taher says:

    saya bingung

    public function actionChangePassword()
    {
    $data=$this->loadModel(Yii::app()->user->id);//get current user that active now

    if(isset($_POST[‘old’],$_POST[‘baru1’],$_POST[‘baru2’])) // if user post to change password
    {
    if($_POST[‘baru1’]!==$_POST[‘baru2’]) // check if it have same password for validation?
    {
    $data->addError(‘username’,’paswword gk cucok’); // if not same, show error
    }
    else // if same, next
    {
    if(CPasswordHelper::verifyPassword($_POST[‘old’], $data->password)) // check the old password that user input same with old password?
    {
    $dua=$_POST[‘baru1’];
    $data->password=CPasswordHelper::hashPassword($_POST[‘baru1’]);// encryp that
    if($data->save()) // save to tabel
    {
    $this->redirect(array(‘/site’));
    }
    }
    else //if password not match with old password, show error
    {
    $data->addError(‘username’,’Wrong Salah’);
    }
    }
    }

    $this->render(‘cp’,array(
    ‘data’=>$data,
    ));
    }

    modell user

    public function validatePassword($password)
    {
    return CPasswordHelper::verifyPassword($password,$this->password);
    }

    public function hashPassword($password)
    {
    return CPasswordHelper::hashPassword($password);
    }
    public function beforeSave()
    {
    $this->password = $this->hashPassword($this->password);
    return parent::beforeSave();
    }

    gk mau.. jalan

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: