October 9, 2011
by Sabit Huraira
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… 😀
Komentar