[Yii Framework] Use CPasswordHelper For Authentication
August 12, 2013 17 Comments
Note : available for Yii 1.1.14.
Yii framework telah merilis versi 1.1.14, salah satu fitur tambahan yang ada yaitu class CPasswordHelper terbaru : http://www.yiiframework.com/news/75/yii-1-1-14-is-released/. Class ini sendiri menyediakan fungsi-fungsi yang dapat digunakan untuk proses autentikasi seperti register dan login. So what the different with md5 or sha? For more information about this class, you can see this wiki : http://www.yiiframework.com/wiki/425/use-crypt-for-password-storage/.
Baiklah, pada postingan ini i will explain how to use this class and compare it with md5 way.
CREATE REGISTER USER
Saya asumsikan kita memiliki tabel seperti berikut untuk tabel user :
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `name` varchar(45) NOT NULL, `password` varchar(100) NOT NULL, `salt_password` varchar(100) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
kita menggunakan password dan salt_password untuk memperkuat enkripsinya ketika kita lakukan dengan md5. Berikut implementasi untuk register user yang kita buat, pada model user kita membuat fungsi untuk generate salt_password dan men-genearate nilai hash password untuk password user.
public function beforeValidate() { if($this->isNewRecord) { $this->salt_password=$this->generateSalt(); //before validate, we create random value for salt_password } return parent::beforeValidate(); } public function beforeSave() { if($this->isNewRecord) { $pword=$this->password; $this->password=$this->hashPassword($dua,$this->salt_password); // set password value // with value that have been genereate with md5 } return parent::beforeSave(); } // use for validate password when do login public function validatePassword($password) { return $this->hashPassword($password,$this->salt_password)===$this->password; } // use for generate hash password public function hashPassword($password,$salt) { return md5($salt.$password); } // use for generate random value public function generateSalt() { return uniqid('',true); }
Kemudian untuk fungsi loginnya, kita buat seperti berikut pada component/useridentity :
private $_id; public function authenticate() { $username = strtolower($this->username); $user = FUser::model()->find('LOWER(username)=?', 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->username; $this->errorCode = self::ERROR_NONE; } return $this->errorCode == self::ERROR_NONE; } public function getId() { return $this->_id; }
dan kode di atas, ketika kita melakukan register akan menghasilkan data seperti berikut :
'1', 'sabit', 'sabit', 'a4057733cf4710736b652963a701746d', '520869a6a1d376.93126928'
Lalu bagaimana dengan implementasi menggunakan cpasswordhelper, yang perlu kita rubah pada bagian model menjadi seperti berikut :
public function beforeSave() { if($this->isNewRecord) { $pword=$this->password; $this->password = CPasswordHelper::hashPassword($pword); } return parent::beforeSave(); }
Sementara itu untuk fungsi validatePassword, hashPassword, generateSalt tidak lagi digunkana pada fungsi ini. Kemudian untuk fungsi login kita buat menjadi seperti berikut :
private $_id; public function authenticate() { $username = strtolower($this->username); $user = FUser::model()->find('LOWER(username)=?', array($username)); if($user===null) $this->errorCode=self::ERROR_USERNAME_INVALID; else if(!CPasswordHelper::verifyPassword($this->password, $user->password))// here we do change $this->errorCode = self::ERROR_PASSWORD_INVALID; else { $this->_id = $user->id; $this->username = $user->username; $this->errorCode = self::ERROR_NONE; } return $this->errorCode == self::ERROR_NONE; } public function getId() { return $this->_id; }
dan dengan menggunakan cpasswordhelper, kita akan mendapatkan nilai seperti berikut :
'3', 'andi', 'andi', '$2a$13$ESeZW/8I.lZLWZTomyUKteo0bHmTroH.G91lElgCtXOcrVfmKiPQ.', ''
You can see it we no need with salt_password again..
Finish… Hope it help… happy coding..
Komentar