Memulai Pembuatan Aplikasi Web dengan Yii2 (8): Autentikasi ke Database MySQL
Muhammad Arslan 7 September 2016
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: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
return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=soccerdb', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', ];
<?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:
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:
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' => [ 'id' => '100', 'username' => 'admin', 'password' => 'admin', 'authKey' => 'test100key', 'accessToken' => '100-token', ], '101' => [ 'id' => '101', 'username' => 'demo', 'password' => 'demo', 'authKey' => 'test101key', 'accessToken' => '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' => $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' => $username]); } /** * @inheritdoc */ public function getId() { return $this->id; } /** * @inheritdoc */ public function getAuthKey() { return $this->authKey; } /** * @inheritdoc */ public function validateAuthKey($authKey) { return $this->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->password === $password; return $this->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:
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)