[Yii Framework] Halaman Register dengan Password Generate dan Email Confirmation

Ada banyak teknik melakukan operasi “register” pada suatu sistem. Salah satu nya adalah dengan cara memerintahkan sistem secara langsung memberikan password kepada pengguna yang telah melakukan proses register ke suatu sistem kemudian mengirimkan password yang sudah dihasilkan secara otomatis tadi ke email pengguna.. Ya, saya akan paparkan langkah-langkah melakukan operasi register dengan metode tersebut…

Pertama-tama silahkan rancang database anda. Tentunya minimal anda harus memiliki attribut “username”, “password”,  dan “email”. Email sendiri disini dibutuhkan karena kita akan melakukan konfirmasi pendaftaran langsung ke email pengguna.. Dan untuk keamanan, saya menambahkan attribut “saltPassword”. Salt Password sendiri adalah attribut yang digunakan sebagai key hasil enkripsi dari attribute “password”. Berikut sql dari tabel “user” pada database saya :

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` varchar(50) NOT NULL,
  `pass` varchar(50) NOT NULL,
  `sPass` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `jk` enum('male','female') NOT NULL,
  `nama` varchar(50) NOT NULL,
  `tglLahir` date NOT NULL,
  `isActive` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Okeh, setelah selesai membuat database, silahkan generate “model” dan “CRUD” dengan menggunakan Gii dari Yii Framework. Setelah melakukan proses generate, akan ada file “User.php” pada models, “UserController.php” pada controller, dan folder “User” pada views. Buka “User.php”, lalu lakukan beberapa perubahan seperti berikut :

Pada model tersebut, tambahkan fungsi-fungsi berikut :

	public function validatePassword($password)
	{
		return $this->hashPassword($password,$this->sPass)===$this->pass;
	}
	
	public function hashPassword($password,$salt)
	{
		return md5($salt.$password);
	}

	public function generateSalt()
	{
		return uniqid('',true);
	}
	
	public function rans()
        {
    	         $cc = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    	         $rr = '';
    	         for ($i = 0; $i < 10; $i++)
                      $rr .= $cc[rand(0, strlen($cc))];
    	        return $rr;
         }

Penjelasan :

  • Fungsi validatePassword() digunakan untuk melakukan pencocokan password hasil enkripsi dengan password inputan pengguna saat login.
  • Fungsi hashPassword() digunakan untuk mengkonversi password hasil enkripsi dengan md5.
  • Fungsi generateSalt() digunakan untuk menggenerate saltPassword secara otomatis.
  • Fungsi rans() digunakan untuk menghasilkan random string untuk menggenarate password secara otomatis.

Lalu untuk keamanan pada proses register, kita berikan “captcha”. Anda dapat lihat cara menambahkan captcha disini. Setelah itu, buka folder views/user, dan buka file _form.php. Lalu lakukan beberapa perubahan menjadi seperti berikut :

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'user-form',
	'enableAjaxValidation'=>false,
)); ?>
	<p class="note">Fields with <span class="required">*</span> are required.</p>
	<?php echo $form->errorSummary($model); ?>

	<div class="row">
		<?php echo $form->labelEx($model,'user'); ?>
		<?php echo $form->textField($model,'user',array('size'=>50,'maxlength'=>50)); ?>
		<?php echo $form->error($model,'user'); ?>
	</div>
	
	<div class="row">
		<?php echo $form->labelEx($model,'nama'); ?>
		<?php echo $form->textField($model,'nama',array('size'=>50,'maxlength'=>50)); ?>
		<?php echo $form->error($model,'nama'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'email'); ?>
		<?php echo $form->textField($model,'email',array('size'=>50,'maxlength'=>50)); ?>
		<?php echo $form->error($model,'email'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'jk'); ?>
		<?php echo $form->dropdownlist($model,'jk',array('male'=>'Male','female'=>'Female'),array('style'=>'width:250px')); ?>
		<?php echo $form->error($model,'jk'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'tglLahir'); ?>
		<?php $this->widget('zii.widgets.jui.CJuiDatePicker',
			array(
			    'language'=>'id',
                'model'=>$model,
              	'attribute'=>'tglLahir',
              	'value'=>$model->tglLahir,
             	'options'=>array(
                	'showAnim'=>'fold',
                	'dateFormat'=>'yy-mm-dd'
              	),
            	'htmlOptions'=>array(
               		'style'=>'height:15px;',
            	),
          	));
		?>
		<?php echo $form->error($model,'tglLahir'); ?>
	</div>
	
	<?php if (extension_loaded('gd')): ?>
        <div class="row">
            <?php echo CHtml::activeLabelEx($model, 'verifyCode') ?>
        <div>
        <?php $this->widget('CCaptcha'); ?>
        <?php echo CHtml::activeTextField($model,'verifyCode'); ?>
        </div>
        <div class="hint">Ketik tulisan yang ada pada gambar .
        <br/>Tulisan tidak case sensitive</div>
        </div>
	<?php endif; ?>
	
	<div class="row buttons">
		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
	</div>

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

Penjelasan : pada code di atas, saya menghilangkan beberapat attribute yaitu “pass”,”sPass”, “isActivate” dimana ketiga attribute tersebut memang tidak akan diinput oleh pengguna melainkan di generate secara otomatis dari sistem. Lalu silahkan buka “UserController”. Lalu rubah actionCreate menjadi seperti berikut :

	public function actionCreate()
	{
		$model=new User;

		if(isset($_POST['User']))
		{
			$model->attributes=$_POST['User'];
			
			$dua=User::model()->rans();
			$model->sPass=$model->generateSalt();
			$model->pass=$model->hashPassword($dua,$model->sPass);
			$model->isActive=0;
			
			if($model->save())
			{
				$mailer = Yii::createComponent('application.extensions.mailer.EMailer');
     			$mailer->IsSMTP();
     			$mailer->IsHTML(true);
     			$mailer->SMTPAuth = true;
     			$mailer->SMTPSecure = "ssl";
     			$mailer->Host = "smtp.gmail.com";
     			$mailer->Port = 465;
     			$mailer->Username = "a@myweb.com";
     			$mailer->Password = 'a';
     			$mailer->From = "Admin";
     			$mailer->FromName = "Admin";
     			$mailer->AddAddress($model->email);
     			$isi='Hai '.$model->nama.'<br/> Anda telah melakukan register dengan :<br/>
     			Username  :'.$model->user.'<br/>
     			Password  :'.$dua;
     			$mailer->Subject = "Confirmation.";
     			$mailer->Body = $isi;
     			$mailer->Send();
				$this->redirect(array('view','id'=>$model->id));
			}
		}

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

Penjelasan : pada code di atas, dilakukan proses penyimpanan data-data pengguna ke dalam database. Proses penyimpanan tersebut akan melakukan generate attribute “pass” dan “sPass”. Selain itu juga sistem juga akan secara otomatis menginput data attribute “isActive” dengan nilai “0”.  Setelah melakukan penyimpanan, sistem akan secara otomatis memberitahukan “nama” dan “password” ke email pengguna yang telah dimasukkan oleh pengguna pada proses “register” tadi. Disana juga terdapat fungsi untuk mengirim email yang dapat lihat disini tutorial membuat nya..

Okeh, setelah itu silahkan anda buat proses untuk melkukan login untuk membuktikan bahwa password yang sudah di generate tadi bisa digunakan. Buka  folder protected/components pada project anda. Lalu buka UserIdentity.php yang ada pada folder tersebut. Lalu rubah code nya menjadi seperti berikut :

<?php
class UserIdentity extends CUserIdentity
{
	private $_id;
	public function authenticate()
	{
		$username = strtolower($this->username);
		$user = User::model()->find('LOWER(user)=?', array($username));
		if($user===null)
		    $this->errorCode=self::ERROR_USERNAME_INVALID;
		else if(!$user->validatePassword($this->password))
		    $this->errorCode = self::ERROR_PASSWORD_INVALID;
		else
		{
		    $this->_id = $user->id;
		    $this->username = $user->user;
		    $this->errorCode = self::ERROR_NONE;
	    }
	    return $this->errorCode == self::ERROR_NONE;
	}
	
	public function getId()
	{
		return $this->_id;
	}
}

Yah, selesai… silahkan jalankan fungsi tersebut..

Lakukan proses register, lalu setelah selesai buka email yg sudah anda input pada proses register tadi..

Kemudian akan ada pesan dari sistem anda.. Lalu gunakan akun yang sudah tertera pada email tersebut untuk melakukan proses login..

Jika apa yang anda buat sudah benar, maka anda akan masuk ke halaman sistem dengan akun yang sudah anda buat tadi..

Selesai… Selamat mencoba..

Semoga membantu… 😀

68 Responses to [Yii Framework] Halaman Register dengan Password Generate dan Email Confirmation

  1. angel says:

    misal qta punya tabel yang datanya ada yg tipe datetime atau timestamp cara buat insert ma updatenya gimana?

  2. sabitzhabit says:

    langsung di generate aja bisa kok.. yg penting wktu nginput datanya disamain aja format penulisan tahun, bulan, dan tanggal nya..

  3. bangmartha says:

    Class ‘user’ does not exist or has syntax error. urutannya saya generate model dg nama user, dan generate controler dg nama user, lalu generate crud dg nama user
    tapi ada alert di model classnya :Class ‘user’ does not exist or has syntax error.

    please pak urutannya apa?

  4. sabitzhabit says:

    yg pertama di buat itu modelny dlu gan..
    coba jangan diisi “user”, tapi “User” gan.. awalannya pake huruf gede..
    cz klo generate, dia nama modelnya otomatis pake huruf gede awalannya..

  5. angel says:

    gan, emailnya ko ga kekirim ya??
    emang kalo masih pake localhost ga bisa ngirim ya???
    q connect ke inet trus c..
    trus yg ini wajib ga???
    $mailer->SMTPSecure = “ssl”;
    $mailer->Host = “smtp.gmail.com”;
    $mailer->Port = 465;

    tq..

  6. sabitzhabit says:

    iya gan, itu harus konek trus, dan ane jg pake localhost kok gan.. ane pake akun gmail ane gan buat ngrim imel nya.. jadi dsana pake smtp.gmail,com

    ada pesen error ny?

    • angel says:

      ga ada, tapi jg ga kekirim…
      q jg pake gmail ko…

      slain set di controller kan seting di config/main jg kan gan?
      ‘mailer’ => array(
      ‘class’ => ‘application.extensions.mailer.EMailer’,
      ‘pathViews’ => ‘application.views.email’,
      ‘pathLayouts’ => ‘application.views.email.layouts’
      ),
      q ngopi dari extensionnya kaya gitu…
      ada settingan lain ga???

  7. angel says:

    oh iya..
    portnya itu port apa ya???

  8. sabitzhabit says:

    wah, kenapa yak?
    ga ada yg disetting lagi kok gan.. malah yg di class config/main itu ga ane apa2in gan..
    udah dibuat sama keyak postingan ini gan? https://sabitlabscode.wordpress.com/2011/09/22/yii-framework-send-email-with-php-mailer/

  9. angel says:

    ok q coba dulu gan…
    q pake xampp..
    mercurynya ga perlu diaktifin dulu kan??

  10. angel says:

    error kaya gini gan…
    tapi tetep ga kekirim….
    SMTP Error: Could not connect to SMTP host. Message sent successfully!

  11. angel says:

    udah jadi gan….
    ternyata extension : openssl lom ada di php.ini
    tq

  12. angel says:

    gan, itu password yg buat login, hashnya ato yg user masukin pas register??
    q nyoba ga berhasil…
    ga ada error tapi data jg ga masuk ke db…
    db q jg ga ada sPass nya….
    q coba masukin di variabel ga brhasil…

    q masih pake password yg biasa…..
    jasi apa yg dimasukin user itu yg disimpen….
    ada masalah ga kalo kaya gitu????

  13. sabitzhabit says:

    yg di masukin itu yg hash ny gan..
    ya klo agan buat ny pake password biasa(tanpa enkripsi), ga langsung aja di masukin ke database apa yg d input oleh user..
    ga ada masalah gan, tapi kurang bagus aja dari sisi security nya..

  14. angel says:

    jadi kalo user login ke sistem passwordnya pake yg hash???
    q nyoba ga bisa soalna….
    q coba kaya gini di beforesafe nya:
    $pass = md5(md5($this->password).Yii::app()->params[“salt”]);
    $this->password = $pass;
    return true;

    data yg kesimpen hasil hashnya….
    tapi kalo buat login ga mau….
    antara yg user masukin ma hash nya sama2 ga failed….

  15. angel says:

    dah jadi gan…
    tq….

  16. hardinata says:

    gan mau tanya..
    aku saat generate model kok tiba2 aphace kok mati ya

    tolong pencerahan

    thanks

  17. wah kanapa ya? saya ga pernah juga mas ngalamin hal seperti itu.. belum tau juga..

  18. jenengku says:

    mas bro…
    saya mau tanya dong (masih newbie nih). Klo form login ditambah tahun sebagai global variabel yang akan dipake dibeberapa form berikutnya gimana caranya ya? saya udah coba otak-atik di UserIdentity dengan $this->setState(‘tahunlogin’, $this->tahun); dan dipanggil dengan Yii::app()->user->tahunlogin kenapa gagal? terima kasih untuk solusinya.
    salam kenal
    eko

  19. mksd ny itu tahun di simpen di database ga mas? atau cuma session biasa?

  20. Nurman says:

    gan pas ane input datanya masuk ke db tpi g ke kirim ke email.
    msalahnya dimana ya gan..?

  21. berrti yang di email ny masih salah gan..

  22. Nurman says:

    maksudnya alamat emailnya salah atau dmananya?
    coba ksih contoh deh buat Troubleshootnya dong..

  23. agan udah baca yang postingan cara kirim email? udah bisa apa belum kalo ngirim email gan?

    saya ga sempet gan kalo kasih contoh detail, saya cuma akan kasih clue aja kalo ada pertanyaan.. kalo coding agan harus rajin nyoba2+googling gan biar ngerti.. saya juga gitu kok kalo lagi pusing error terus..

  24. dwijonarko says:

    mantap sekali tutorialnya…
    salam kenal saya baru murtad dari framework yang *itu* ke yii 😀

    salam kenal 🙂

  25. dwijanarko : haha.. selamat anda udah di jalan yang benar..

  26. Restu Herwanto :
    bang sabit mau nanya lagi , ko malah ada error kya gni Property “User.verifyCode” is not defined. knapa ya ? 😀
    mksih 🙂

  27. beertrti $verifyCode belum di definisiin di model user gan..

  28. siip makasih ka , skarng udah ga error lagi, dan confirmasi dah nyampe email 🙂
    mksih 🙂

  29. mugi says:

    gan mau nanya , ini knapa yaa apanya yg salah,.
    SMTP Error: Could not connect to SMTP host.

    Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\barudakti\protected\extensions\mailer\phpmailer\class.phpmailer.php:522)

  30. yg di pertanyaan satu nya uda saya jawab gan..

  31. OBERSEBLODYPE says:

    register

  32. ka mau tanya, kalo tampilan nya bisa diganti ga ?
    jadi pesan di emailnya itu kya pake template gitu ..
    mksih .

  33. petanyaan beda lagi :
    ka, kalo ga ada koneksi ke internet kan pasti keliatan tuh debug nya kaya gini :
    SMTP Error: Could not connect to SMTP host.
    PHP warning

    Cannot modify header information – headers already sent by (output started at D:\PKL\xampp\htdocs\cerah\protected\extensions\mailer\phpmailer\class.phpmailer.php:522) .. dll.

    nah gimana caranya buat ngatsin itu, jadi error seperti itu ga adain, atau ada pemberitahuan apalah gituu ka ..
    mohon bantuannya 🙂

  34. yuza says:

    mas sory ane newbie mw tanya..
    stelah ane nyoba langkah2 di atas kok ane gk bisa login pke form login defaultnya ya..?? apa passwordnya brubah jga ato gmna ya..??
    thx sebelumnya.. ane bru aj belajar nih fraamework soalnya..

    • mksd nya ga bisa gimana mas? ada pesan error?

      • yuza says:

        udah bisa mas.. yg itu.. cma yg blm bisa itu klo kita udh dpt email passwordnya.. nah mw login pake user yg udah d bwt td itu gk bisa mas.. padahal user identity udah ane ganti.. itu knapa ya..??

  35. yuza says:

    oya masbro sory tanya lagi.. itu jga gk bisa login pake user sama password yang udah dikirim ke email kita.. padahal user identity nya udah ane copas kya yg di atas.. knapa ya masalahnya..??

  36. andie says:

    gan mau tanya, biar yii gk pake session gimana?, capek harus selalu login. thx

  37. WarnaWan!e says:

    Hai sahabat, saya dari malaysia..

    Ada soalan, kenapa bila saya cuba login, keluarkan error incorrect password? saya masukkan password yang sistem sudah auto-generate.. semasa register, data semua sudah masuk dalam database.

    Terima Kasih.

  38. bejo says:

    di view>folder user, kok tidak ada ya file dengan nma user.php
    tolong suhu dibantu caranya

  39. file user nya di model gan maksudnya. Sory, seperti nya kalimat saya emang ambigu..

  40. mas, saya udah coba tutorial di atas,, dan udh coba register.. setalah register dapat email username dan password,, tapi bgtu username dan password di gunakan login tidak bisa login,, mohon bantuannya mas?

    • coba cek di database apakah sudah masuk data nya? kalo udah apakah di useridentity.php sudah di modifikasi?

      • useridentity.php juga sudah di modifikasi mas…
        class UserIdentity extends CUserIdentity
        {
        /**
        * Authenticates a user.
        * The example implementation makes sure if the username and password
        * are both ‘demo’.
        * In practical applications, this should be changed to authenticate
        * against some persistent user identity storage (e.g. database).
        * @return boolean whether authentication succeeds.
        */
        private $_id;
        public function authenticate()
        {
        $username = strtolower($this->username);
        $user = User::model()->find(‘LOWER(user)=?’, array($username));
        if($user===null)
        $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if(!$user->validatePassword($this->password))
        $this->errorCode = self::ERROR_PASSWORD_INVALID;
        else
        {
        $this->_id = $user->id;
        $this->username = $user->user;
        $this->errorCode = self::ERROR_NONE;
        }
        return $this->errorCode == self::ERROR_NONE;
        }

        public function getId()
        {
        return $this->_id;
        }
        }

    • irham says:

      itu username sama password udh masuk ke email gan?

  41. saya cek datanya sudah masuk mas

    • coba cek di database nya mas, berapa panjang password yang mas sediakan? biasa nya dia password yang dihasilkan misal 100 karakter, tetapi yang disediakan cuma 50 karakter.

  42. gan cara pemanggilan di url nya gimana? saya blm tau , makasih

  43. gan mohon bantuannya cara akses halaman registrasinya gmana?

  44. url buat registrasi nya mas, setelah kita buat tutor itu cara manggil nya gimana? mf ngrepotin ane masih nubie

  45. dewi says:

    kalo pake cpassword helper ?? dan buat aktivasi dikirik ke email pendaftar

  46. andri says:

    kok dibatasin yh, komenya , sya koment berkali2 dihapus

  47. mas, kalau kita buat update password dengan membandingkan ke password lama gimana ya mas kalau pake CPassword helper?
    cara comparenya gimana ya mas

  48. Bayu laksmana says:

    mas kalau mau menghubungkan antara form satu dengan form lainnya dan di taruh di halam utama aplikasi bagaimana ya mas?

  49. ajo says:

    mas mau nnya kalau kita sudah berhasil masuk dan ingiin merbuah password nya gmn?

  50. mas mau nanya.. pas klik kirim ko ga kekirim emailnya ? .. open_ssl nya udh aktif.. gaada error apapun.. tapi emailnya ga kekirim aja.. knpa yaa mas ? mohon bantuannya

Leave a reply to Sabit Huraira Cancel reply