Memulai Pembuatan Aplikasi Web dengan Yii2 (8): Autentikasi ke Database MySQL

Muhammad Arslan 7 September 2016

Memulai Pembuatan Aplikasi Web dengan Yii2 (8): Autentikasi ke Database MySQL

Setelah mengenal session dan flash data, sekarang kita akan mencoba memodifikasi authentication yang terdapat di package yii2-basic. Sebenarnya kita dapat menggunakan yii2-advance yang sudah memiliki banyak fitur canggih dibandingkan yii2-basic. Autentikasi yii2-basic masih belum terhubung ke database dan hanya mengandalkan array PHP saja. Sekarang kita akan mencoba migrasi database disertai memodifikasi model User agar dapat melakukan autentikasi yang terhubung ke database.

Mari kita lanjutkan tutorial ini untuk dapat melakukan autentikasi di Yii2.

Persiapan Coding

Sebelum melanjutkan tutorial ini, pastikan Anda mengatur config/web.php seperti pada source code berikut:
<?php

return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=soccerdb', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', ];

Bila Anda mempunyai database lain, silahkan ganti dengan nama database milik Anda. Sesuaikan juga username dan password sesuai konfigurasi MySQL yang ada di komputer/laptop, Anda. Kemudian buat juga sebuah file dengan nama HelloAuthController.php di folder controllers.

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;

class HelloAuthController extends Controller
{
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
}

Migrasi Tabel User Ke Database MySQL

Bagian yang menarik saat ini adalah adanya fitur migrasi database, dimana kita tidak perlu mengubah tabel di suatu database secara langsung, kita dapat menggunakan migration tool yang dimiliki Yii2, untuk mengubah suatu tabel di database yang kita akses. Saat ini di Yii2, masih mengharuskan kita untuk mengubah skrip migrasi secara manual. Oleh karena itu pastikan Anda meluangkan waktu untuk membaca berbagai API yang dimiliki oleh migration tools Yii2.

Untuk memulai migrasi, silahkan masuk ke folder proyek Yii2 Anda, kemudian gunakan skrip yii dengan parameter migrate/create diikuti nama migrasi yang akan dilakukan. Dalam hal ini, kita akan melakukan migrasi baru dengan nama create_users:

$ cd /path/to/yii2-folder/
$ ./yii migrate/create create_users

Setelah membuat migrasi baru, silahkan edit file create_users tadi di folder migrations. Kemudian edit isi kode yang ada di dalam function up(). seperti pada kode berikut:

<?php

use yii\db\Migration;

/**
 * Handles the creation for table `users`.
 */
class m160903_163701_create_users extends Migration
{
    /**
     * @inheritdoc
     */
    public function up()
    {
        $this->createTable('users', [
            'id' => $this->primaryKey(),
            'username' => $this->string()->notNull()->unique(),
            'authKey' => $this->string(32)->notNull(),
            'password' => $this->string()->notNull(),
            'email' => $this->string()->notNull()->unique(),
            'accessToken' => $this->string(32)->notNull(),
        ]);
    }

    /**
     * @inheritdoc
     */
    public function down()
    {
        $this->dropTable('users');
    }
}

Bila nama class dan file tidak sama dengan kode diatas, itu tidak masalah. Karena m160903_163701 menunjukkan waktu migrasi tersebut dibuat. Ada dua fungsi utama di dalam class Migration, yaitu up() dan down(). Fungsi up() digunakan untuk membuat tabel, sedangkan down() digunakan untuk menghancurkan tabel. Pada source code diatas, kita hanya membuat sebuah field string. Ada yang memiliki panjang sebanyak 32 karakter, dan ada juga yang dibuat unique seperti field username dan email.

Setelah selesai membuat kode migrasi, sekarang saatnya kita buat tabel users sesuai migrasi diatas. Silahkan eksekusi perintah berikut di konsol:

$ ./yii migrate/up

Bila berhasil maka akan muncul dua tabel berikut di database yang kita gunakan:

Selection_010 Selection_011 Selection_013 Selection_012

 

Selanjutnya mari kita buat satu akun users melalui PHPMyAdmin. Sebelumnya kita buat dulu sebuah password dengan isi rahasia dan di-hash dengan SHA1 melalui SQL Editor:

Selection_014 Selection_015 Selection_016

Mengubah Source Code models/User.php

Agar dapat melihat perbedaanya, beberapa baris source code asli dari User.php tetap dibiarkan. Silahkan sesuaikan kode User.php yang ada di folder Anda, dengan kode User.php berikut ini. Abaikan kode yang dikomentari bila ingin tidak menyertakannya di file Anda:
<?php

namespace app\models; use yii\db\ActiveRecord;

class User extends ActiveRecord implements \yii\web\IdentityInterface { /* public $id; public $username; public $password; public $authKey; public $accessToken;

private static $users = [
    '100' =&gt; [
        'id' =&gt; '100',
        'username' =&gt; 'admin',
        'password' =&gt; 'admin',
        'authKey' =&gt; 'test100key',
        'accessToken' =&gt; '100-token',
    ],
    '101' =&gt; [
        'id' =&gt; '101',
        'username' =&gt; 'demo',
        'password' =&gt; 'demo',
        'authKey' =&gt; 'test101key',
        'accessToken' =&gt; '101-token',
    ],
];
*/

/**
 * @inheritdoc
 */
public static function tableName()
{
    return 'users';
}

/**
 * @inheritdoc
 */
public static function findIdentity($id)
{
    // return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    return static::findOne($id);
}

/**
 * @inheritdoc
 */
public static function findIdentityByAccessToken($token, $type = null)
{
    /*foreach (self::$users as $user) {
        if ($user['accessToken'] === $token) {
            return new static($user);
        }
    }

    return null;
    */

    return static::findOne(['access_token' =&gt; $token]);
}

/**
 * Finds user by username
 *
 * @param string $username
 * @return static|null
 */
public static function findByUsername($username)
{
    /*foreach (self::$users as $user) {
        if (strcasecmp($user['username'], $username) === 0) {
            return new static($user);
        }
    }

    return null;
    */

    return static::findOne(['username' =&gt; $username]);
}

/**
 * @inheritdoc
 */
public function getId()
{
    return $this-&gt;id;
}

/**
 * @inheritdoc
 */
public function getAuthKey()
{
    return $this-&gt;authKey;
}

/**
 * @inheritdoc
 */
public function validateAuthKey($authKey)
{
    return $this-&gt;authKey === $authKey;
}

/**
 * Validates password
 *
 * @param string $password password to validate
 * @return boolean if password provided is valid for current user
 */
public function validatePassword($password)
{
    // return $this-&gt;password === $password;
    return $this-&gt;password === sha1($password);
}

}

Membuat Halaman - Halaman Khusus User yang Terautentikasi

Setelah melakukan migrasi tabel users dan memodifikasi model User.php, sekarang saatnya kita mencoba autentikasi tersebut dengan mengunakannya terhadap beberapa action yang akan kita buat. Kita akan membuat dua buah action yaitu actionPrivatePage() dan actionSecretPage(). Tentu saja karena itu halaman rahasia, jadi hanya dapat dilihat oleh useryang terautentikasi saja. Selain itu kita juga akan mulai menggunakan access control filter sederhana yang ditempatkan di function behaviors(). ACF ini merupakan salah satu proses autorisasi paling sederhana dibandingkan dengan RBAC.

Pada ACF di controller HelloAuthController ini kita akan memasang autorisasi pada kedua action yang telah disebutkan. Kedua action tersebut hanya dapat diakses setelah user terautentikasi melalui halaman login. Sekarang mari kita lanjutkan source code di HelloAuthController.php dengan membuat kode berikut:

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;

class HelloAuthController extends Controller
{

    ........................................


    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['private-page', 'secret-page'],
                'rules' => [
                    [
                        'actions' => ['private-page', 'secret-page'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }

    public function actionPrivatePage()
    {
        echo "Ini adalah private page";
    }

    public function actionSecretPage()
    {
        echo "Ini adalah secrete page";
    }
}

Sekarang mari kita lihat hasilnya seperti pada screenshot berikut:

Selection_017 Selection_018 Selection_019 Selection_020 Selection_020

Penutup

Autentikasi di Yii2, cukup mudah untuk diimplementasikan. Hal ini memberikan keuntungan tersendiri dibanding web framework lain yang harus membuat autentikasi sendiri atau malah memasang external package untuk mendukung fitur tersebut. Yii2 sudah memiliki built-in package untuk mendukung autentikasi ke database. Tutorial ini belum menjelaskan lengkap tentang autentikasi, apalagi fitur - fitur unggul Yii2 lainnya seperti role based access control atau biasa disingkat RBAC. Anda dapat menemukan petunjuknya di "The Definitive Guide to Yii2".

Selamat mencoba :D.

(codepolitan/yiiframework)