Menggunakan database mysql untuk authentikasi login di framework Yii

Secara default, saat membuat aplikasi web dengan bantuan yiic shell di framework Yii, username dan password untuk keperluan login secara default sudah dikodekan ke dalam file php. Dengan defaultnya demo/demo maupun admin/admin sebagai passangan username/password-nya.

Dari dokumentasinya, kita bisa memodifikasi agar Yii mengambil username dan password dari database system. Catatan ini merekam bagaimana memodifikasi file yang diperlukan agar bisa melakukan proses authentikasi menggunakan username dan password yang tersimpan dalam database, karena penulis mengalami kesulitan pada awalnya jadi agar tidak lupa, saya rasa perlu dituliskan sehingga mudah-mudahan juga bermanfaat buat yang lain πŸ™‚

Untuk menggunakan mysql ini, ada beberapa persyaratan yang harus dipenuhi πŸ™‚
1. Framework Yii terinstall dengan benar
2. Membuat webapp dengan yiic tool
2. Operasi CRUD dari tabel User sudah dibuat dan berjalan dengan benar, bisa menggunakan gii maupun yiic shell

Note: Penulis menggunakan sistem operasi Ubuntu Linux
Struktur tabel User yang akan digunakan dalam proses authentikasi mempunyai struktur sebagai berikut (buat kemudahan aja πŸ™‚ ) :
CREATE TABLE IF NOT EXISTS `User` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(250) NOT NULL,
`email` varchar(250) NOT NULL,
`role` enum('superadmin','admin','operator','guest') NOT NULL DEFAULT 'guest',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

Buatlah struktur tabel tersebut dengan tool-tool yang anda sukai

kemudian ubah konfigurasi main.php di dalam folder protected/config/main.php (dalam direktori web kita) agar menggunakan koneksi ke mysql server

//db'=>array(
// 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
//),
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=databaseygdigunakan',
'emulatePrepare' => true,
'username' => 'user',
'password' => 'passwordnyauser',
'charset' => 'utf8',
),

Ada beberapa file yang perlu diubah/ditambahkan agar proses authentikasi, create user, maupun update user bisa berhasil dengan “mulus” .. πŸ™‚

  • tambahkan fungsi bantuan sederhana di class User (protected/models/User.php)

    public function hashPassword($phrase){
    return hash('md5', $phrase);
    }

    Untuk memudahkan proses create dan update user, terutama agar password tersimpan dalam bentuk md5 digest, dan tidak berupa plain text.
  • Ubah Class UserIdentity (protected/components/UserIdentity.php) agar mengambil username dan mengautentikasi password menggunakan database yang ada, sehingga menjadi

    findByAttributes(array('username'=>$this->username));
    if($record===null)
    $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if($record->password!==md5($this->password))
    $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
    {
    $this->_id=$record->id;
    $this->errorCode=self::ERROR_NONE;
    }
    return !$this->errorCode;
    }

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

  • Kemudian agar proses create maupun Update user bisa langsung menyimpan password dalam bentuk terenkripsi (md5), ubah/tambahkan beberapa kondisi di controller User (protected/controller/UserController.php), terutama untuk function actionCreate dan function actionUpdate :)
    tambahkan

    $model->password = $model->hashPassword($_POST['User']['password']);

    di fungsi create maupun update sehingga menjadi

    .....
    $model->attributes=$_POST['User'];
    $model->password = $model->hashPassword($_POST['User']['password']);
    if($model->save())
    .....

    .... adalah kode bawaan masing-masing fungsi tersebut

    Kemudian coba test, dengan user dari database (kita dapat memasukannya sendiri ke tabel User dengan password di set dengan fungsi md5)
    ini contoh dari penulis

    dan setelah login menggunakan user yang ada di database

    Dan ini adalah screenshoot untuk create user

    Kalau create user sukses, seperti tampak pada screenshot di bawah ini. terlihat bahwa entry password tersimpan dalam bentuk yang terenkripsi.

    Dan ini adalah untuk update user,

    Dan lihat kembali hasilnya, proses update-pun menyimpan password dalam bentuk terenkripsi

    Dikumpulkan dari berbagai sumber :
    1. "Great" Dokumentasi Yii
    2. dari google dan berbagai sumber lain

    Advertisements
  • Comments
    15 Responses to “Menggunakan database mysql untuk authentikasi login di framework Yii”
    1. Wah langsung dipraktekan ilmunya πŸ˜€

    2. masterbaim says:

      mas saya newBee mau tanya “findByAttributes” itu library ?? trus dia mengacu ke database mana ??

    3. sarah says:

      makasih ya gan, saya sangat terbantu dengan postingan agan, mungkin mau tanya untuk password varchar(250) gak kegedeaan gan? apa berhubungan jg dengan md5 yang phase ya?

    4. iqbaltaufik says:

      gan ko saya udah login sebagai admin tapi gak bisa nge manage nya ??
      gmna caranya ? mohon bantuannya

    5. rotifogi says:

      manteeeeep maturnuwun kang? jadi bertambah lagi pengetahuan saya

    6. hr54 says:

      kok error dekat findbyattribute nya. penulisan aslina gmana ya, sory masih baru,,

      • dodi says:

        harus di kasih nama dulu atributnya mas, misal dalam contoh diatas naman atributnya seharusnya $model= findattribute dan seterusnya

    7. dyas90 says:

      Masih eror dibagian findByAttributes. Mohon diperjelas untuk code yang bagian ini, mohon dilengkapi lagi

    8. Maaf gan, itu findByAttributes itu menambah fungsi atau merubah fungsi authenticate ?

    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