[Yii Framework] Cara Reset Password

Memberikan fasilitas reset password adalah sesuatu yang perlu kita berikan untuk kemudahan user dalam mengelola akunnya. Berikut tahap-tahap seseorang melakukan reset password.

  • User harus masuk ke sistem(login) dengan akun mereka masing-masing
  • Jika berhasil, user memilih menu reset password.
  • Untuk melakukan reset password, user harus memasukkan password lama dan memasukkan password baru sebagai pengganti password lama
  • Jika sukses, password sudah berubah..
Oh iya, untuk keamanan di dalam sistemnya, saya akan memberikan lapisan keamanan untuk memastika data user terjaga. Hal itu saya lakukan dengan enkripsi password user beserta memberikan saltpassword nya, untuk lebih detail anda bisa lihat disini. Okeh, saya asumsikan anda udah buat fungsi untuk melakukan login, register, dan logout pada sistem anda. Jadi saya disini hanya akan fokus pada fungsi melakukan reset password.
Sebelumnya jika anda ngikutin step-step pembuatan login, logout, dan register pada postingan saya disini, maka anda harus melakukan modifikasi pada beberapa step yang ada disana.
Pertama, hapuslah fungsi “beforeSave()” yang ada pada model. Lalu rubah “actionCreate”/”actionRegister” anda menjadi seperti berikut:
	public function actionRegister()
	{
		$model=new MUsertab;

		if(isset($_POST['MUsertab']))
		{
			$model->attributes=$_POST['MUsertab'];
		
			$dua=$model->password;
			$model->saltPassword=$model->generateSalt();
			$model->password=$model->hashPassword($dua,$model->saltPassword);
			$model->level=20;
			
			if($model->save())
				$this->redirect(array('site/login'));
		}

		$this->render('register',array(
			'model'=>$model,
		));
	}

Penjelasan : code tersebut sebenarnya sama aja fungsinya dengan fungsi “beforeSave” sebelumnya. Hanya saja untuk keperluan “Reset Password”, maka saya pindahkan ke dalam controller fungsi tersebut. Hal ini karena pada saat sistem melakukan “reset password”, maka fungsi tersebut tidak perlu menjalankan fungsi beforeSave tersbut. Jadi saya pilih langsung meletakkan code tersebut pada action-action yang memang memerlukan fungsi tersebut..

 

Setelah anda sudah melakukan hal di atas, buatlah sebuah tamiplan untuk merubah password nya. Disini saya beri nama file nya “reset.php”. Lalu masukkan code berikut:

<?php
$this->breadcrumbs=array(
	'Users'=>array('index'),
	'Reset Password',
);
?>
<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'coba-form',
	'enableAjaxValidation'=>false,
)); ?>

        <div class="row">
                <?php echo Chtml::label('Old Password',''); ?>
		<?php echo Chtml::passwordField('oldpassword'); ?>
	</div>

	
	<div class="row">
		<?php echo Chtml::label('New Password',''); ?>
		<?php echo Chtml::passwordField('newpassword'); ?>
	</div>
	
	<div class="row buttons">
		<?php echo CHtml::submitButton('Reset Password'); ?>
	</div>
<?php $this->endWidget(); ?>

Setelah itu buat sebuah action untuk mengeksekusi perubahan passwor nya, seperti berikut:

	public function actionResetpass()
	{
		$model=$this->loadModel(Yii::app()->user->id);

		if(isset($_POST['oldpassword'],$_POST['newpassword']))
		{	
			
			if($model->validatePassword($_POST['oldpassword']))
			{
				$dua=$_POST['newpassword'];
                                $model->saltPassword=$model->generateSalt();
				$model->password=md5($model->saltPassword.$dua);
				
				$model->save(false);
					$this->redirect(array('view','id'=>$model->id));	
				
			}
		}

		$this->render('reset',array(
			'model'=>$model,
		));
	}

Oh iya, jangan lupa memberi izin user mengakses fungsi tersebut di function  “accessRule()”.

Okeh, selesai…

Selmat mencoba…

Semoga membantu…😀

23 Responses to [Yii Framework] Cara Reset Password

  1. p-man says:

    gan ane mau tanya nih,
    kalau caranya biar pas update passwordnya ndak required gimna ya??.,
    password ane udah d enkripsi ke md5
    trus waktu update pinginnya itu nampil d form passwordnya itu bukan yg hasil md5 tapi yang asli sebelum md5.,
    ane bingung bgt caranya, makasih gan..

  2. sabitzhabit says:

    itu emang nggak bisa di tampilin password asal ny yang sebelum md5 gan. Cz gunanya md5 itu sendiri emang biar si admin/pemilik web sendiri ga bisa ngelihat password penggunanya gan. Itu semua utk menjaga privasi pengguna nya gan… jadi developer juga diharapkan ga bisa ngotak-ngatik code ny utk ngelihat password user..

  3. p-man says:

    trus bisa gak caranya pas update , passwordnya itu ndak harus d isi lagi, jadi walopun d kosongi tetep kesimpennya yg lama.,,
    jadi gak berubah, dari tadi ane coba ane kosongi eh yg d database juga malah ikut berubah gan..,

  4. sabitzhabit says:

    mksd ny “tetep kesimpennya yg lama.,,” gimana gan? coba ceritain lebih detail gan..

  5. p-man says:

    jadi gini gan, waktu create kita masukin password “admin” , masuk k databasenya kan udah d enkripsi jadi “j1jh4j3iohihi” (misal).

    lha trus waktu update, kita gak pingin update password, kan musti d set nih d controllernya, jika field password kosong maka valuenya otomatis value yg lama (“admin”) , trus waktu d klik update kan masuk lagi password “admin” yg uda d enkripsi,.

    tapi kan md5 gak bisa liat yg originalnya, jadi gimna caranya nyimpen value yg “j1jh4j3iohihi” , tapi waktu di klik update ndak d enkripsi lagi password yg udah hasil enkripsi dari kata “admin” tadi ..

    punya ane gitu gan, jadi waktu create “admin” trus pas udpate valuenya udah bisa d set yg “j1jh4j3iohihi” , tapi itu malah d enkrispi lagi sama system,

    lha sekarang gmana caranya biar yg “j1jh4j3iohihi” itu ndak d enkripsi lagi, jadi biar masuk k database tetep “j1jh4j3iohihi” , jadi waktu login kan tetep pake password “admin”.

    maaf gan jadi panjang gini critanya..

  6. sabitzhabit says:

    kayak nya agan pake “beforeSave()” ya di model nya? kalo iya agan ilangin aja itu, trus agan buat penggantinya seperti yang ane paparin di atas gan..

    Trus kalo masalah update nya ga semua, kalo emang dy ga mau di save sebelum di isi semua, agan buat $model->save() menjadi $model->save(false). Itu gunanya untuk nyimpen nilai tanpa ngelewatin validasi nya gan..

  7. p-man says:

    ndak pakai before save gan , ane pake afterValidate() di modelnya ane pake gini

    protected function afterValidate()
    {
    $this->password = $this->encrypt($this->password);
    }

    public function encrypt($value)
    {
    return md5($value);
    }
    .,.,

    jadi kalo yg d false kan itu, gak melalui validasi gan,,
    biarpun ane pakai repeat_password juga gak d validasi berarti??.,

  8. sabitzhabit says:

    iya gan, itu mirip2 sama beforeSave, cuma itu di kerjain setelah di save. Nah, makanya mendingan agan ganti kayak yg ane paparkan di atas. Jadi di masukin langsung di controller nya masing2..

  9. p-man says:

    ok gan makasih udah solved…

  10. tout says:

    Cara nampilin error kalo old password yang dimasukin salah gimana?

  11. pada Yii ada fungsi “addError” untuk nampilin suatu error..
    coba di search aja dlu..

  12. mr.R says:

    gan mau klo errornya pas generateSalt itu gimana?

  13. mr.R says:

    maaf gan salah ketik maksudnya gini, kalo dri reset password ini errornya di generateSaltnya itu gimana?

  14. mr.R says:

    errornya ini User and its behaviors do not have a method or closure named “generateSalt”.

  15. error gmana mksd ny gan?

  16. mr.R says:

    errornya bgini gan, User and its behaviors do not have a method or closure named “generateSalt”.

  17. berrti di model User agan blum ada fungsi generateSalt nya gan..

  18. mr.R says:

    udah gan udah di kasih fungsinya…. yg kaya gini kan?

    protected function generateSalt()

    {
    return uniqid(”,true);
    }

  19. coba protected nya ganti public gan..

  20. Oe-oet says:

    gan…nambahin rules usernya di mana ya, dah dicoba tapi msh belum bisa reset

  21. Anggie Ardina Pramashinta says:

    gan.. ane udah coba ikutin yg kaya tutorial di atas..
    tapi error gini gan..
    The system is unable to find the requested action “reset”.

    di rulesnya udah ane kasih action nya.. itu kenapa ya gan ??

  22. Tugas Adi says:

    Property “TblUserAdmin.saltPassword” is not defined.

    solusinya bang mentok ane

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: