Tutorial Pembuatan Login Dengan Prado Framework
Tutorial ini adalah cara authentikasi pada website dan mengatur hak akses per folder per level user. Contoh ini menggunakan kode program yang saya gunakan dalam aplikasi saya. Mudahan bisa membantu semuanya agar lebih mengerti cara pembuatan authentikasi atau sistem login pada website.
- Sebelum memulai coding di Prado berikut adalah requirement atau kebutuhan dari sistem yang harus dibuat atau dilakukan:
- Sistem login menggunakan database MySQL. Pada database terdapat tabel user yang menyimpan data user yang boleh menggunakan sistem ini. Tabel user minimal memiliki 3 kolom yaitu username, password, dan level. Tabel user menggunakan usernamae sebagai primary key. Untuk kolom level memiliki 2 default yaitu member dan admin. Level adalah hak akses dimana user pada suatu level hanya dapat mengakses folder yang dibolehkan.
- Pada file konfigurasi aplikasi Prado yaitu file application.xml masukkan module database, auth manager, dan user. Berikut contoh dari file application.xml pada aplikasi saya:
<?xml version="1.0" encoding="utf-8"?> <application id="Help Desk" mode="Debug"> <paths> <alias id="page" path="pages" /> <using namespace="page.*" /> <using namespace="Application.modules.*"/> <using namespace="Application.database.*" /> <using namespace="System.Web.UI.ActiveControls.*"/> </paths> <!-- modules configured and loaded for all services --> <modules> <module class="System.Data.ActiveRecord.TActiveRecordConfig" EnableCache="true"> <database ConnectionString="mysql:host=localhost;dbname=test" Username="dbuser" Password="dbpass" /> </module> <module id="auth" class="System.Security.TAuthManager" UserManager="users" LoginPage="login" /> <module id="users" class="System.Security.TDbUserManager" UserClass="Application.dbuser" /> </modules> <services> <!-- page service --> <service id="page" class="TPageService" BasePath="Application.pages" DefaultPage="home"> <!-- modules configured and loaded when page service is requested --> <pages MasterClass="Application.layouts.mainlayout"/> </service> </services> </application>
Pada contoh file diatas yang perlu diperhatikan adalah pada bagian module yang menyimpan settingan database dan authentikasi. Juga pada bagian path dimana terdapat settingan untuk untuk meload class active record pada folder database di folder protected aplikasi.
- Pada folder database di dalam folder protected kita membuat file class UserRecord untuk menyimpan konfigurasi tabel user di database. Berikut adalah contoh dari file UserRecord:
const TABLE='user';public $username;public $password;public $level; public static function finder($className=__CLASS__) { return parent::finder($className); } } ?> - File class dbuser yang akan menghandle login ke database yang diturunkan dari class TDbUserManager berikut contoh kode class dbuser
* User Class mengatur data user yang disimpan di session*/class dbUser extends TDbUser{public function createUser($username) { // Gunakan Active Record pada tabel user untuk mencari primary key // username berdasarkan username yang di input // fungsi ini dipanggil bila login berhasil atau fungsi validate user dibawahnya menghasilkan nilai true $userRecord=UserRecord::finder()->findByPk($username); if($userRecord instanceof UserRecord) // if found { $user=new dbUser($this->Manager); $user->Name=$username; // set username $user->Roles=$userRecord->level; // set role berdasarkan kolom level pada database tabel user $user->IsGuest=false; // the user is not a guest return $user; } else return null; } /** * Fungsi pengecekan apakah input username dan password valid * Fungsi ini dipanggil dari halaman login * parameter string username * parameter string password * mengembalikan nilai boolean true bila user valid. */ public function validateUser($username,$password) { // gunakan UserRecord Active Record untuk mengecek username dan password pada tabel user. return UserRecord::finder()->find('username = ? AND password = ?', array($username, $password))!==null; } /** * fungsi pengecekan level user adalah admin */ public function getIsAdmin() { return $this->isInRole('admin'); } /** * fungsi pengecekan level user adalah member */ public function getIsMember(){ return $this->isInRole('member'); } } ?>Simpan kode di atas ke file dbuser.php dan tempatkan pada folder sesuai settingan pada file application.xml. Dari contoh saya karena saya mengeset lokasi file class dbuser di application yaitu folder protected maka saya menyimpannya pada folder protected di folder aplikasi yang saya buat. Penyimpanan password pada contoh menggunakan clear text untuk memudahkan pengertian. Disarankan untuk menggunakan hash pada password seperti MD5, SHA1, atau tipe hash lainnya.
- Folder member dan admin yang diletakkan didalam folder page aplikasi Prado. Di dalam folder member dan admin kita membuat file dengan nama config.xml. File ini untuk mengatur hak akses ke dalam folder tersebut.Contohnya pada folder admin saya membuat file config.xml dengan isi sebagai berikut: File di atas hanya membolehkan folder tersebut diakses oleh user dengan level admin. Untuk folder member kita bisa menggunakan kode yang sama dengan mengganti allow roles menjadi member.
- Setelah file konfigurasi, database, dan class dbuser telah selesai maka kita tinggal membuat halaman login. Pada contoh yang saya gunakan saya menggunakan komponen active control sehingga halaman login saya menggunakan AJAX untuk verifikasi login. Anda tinggal mengganti dengan komponen standar yang bukan active control bila tidak ingin menggunakan feature AJAX. Halaman login memerlukan 2 file yaitu file template dan file controller PHP. Berikut adalah contoh file template halaman login:
<com:TContent ID="right"><h3>Login</h3><p><com:TLabel ID="txtLoginStatus"/> </p><table border="0" cellpadding="0" cellspacing="0"><tr> <td width="100px">User Name</td> <td>: <com:TTextBox ID="txtUser"/> <com:TRequiredFieldValidator ControlToValidate="txtUser" ErrorMessage="Please provide your username." Display="Dynamic" /> </td> </tr> <td>Password</td> <td>: <com:TTextBox ID="txtPass" TextMode="Password"/> </td> </table> <com:TButton ID="btnLogin" OnCommand="checkLogin" Text="Login"/> </com:TContent>
Contoh diatas dengan asumsi bahwa pada file master template layout terdapat komponen TContentPlaceHolder dengan id right contohnya sebagai berikut:
<com:tcontentplaceholder id="right"/>
Pada kode template diatas terdapat komponen validator yang mengharuskan user untuk mengisi textbox txtUser, bila tidak pada saat form di submit maka akan dimunculkan error bahwa textbox txtUser harus diisi. Bila tidak ada kesalahan maka pada saat button Login di klik maka akan memanggil function checkLogin pada file controller PHP.
- Berikut merupakan contoh kode pada file controller PHP untuk memproses login:
class login extends TPage{function checkLogin($sender,$param){ $authManager=$this->Application->getModule('auth'); //memanggil module auth atau class dbuser // mengecek username dan password dengan memanggil function login// yang akan menjalankan function validateUser pada class dbuser yang telah kita buat sebelumnya. if($authManager->login($this->txtUser->Text,$this->txtPass->Text)) //if login success //masukkan fungsi disini untuk menghandle status bila login sukses if($this->user->isAdmin) //mengecek level user, bila admin maka di redirect ke halaman admin $this->response->Redirect('index.php?page=admin.home'); else //bila bukan admin maka dianggap sebagai member dan di redirect ke halaman member $this->response->Redirect('index.php?page=member.home'); else $this->txtLoginStatus->Text="Login Fail"; //masukkan fungsi disini untuk menghandle status bila login gagal } public function onLoad($param){ parent::onLoad($param); //Check apakah sesi user masih aktif bila iya arahkan ke folder sesuai level user if(if($this->user->isMember) this->response->Redirect('index.php?page=member.home'); else $this->response->Redirect('index.php?page=admin.home'); } } ?>Contoh kode diatas akan memproses input username dan password dengan memanggil fungsi login yang juga menjalankan fungsi validateUser yang telah kita buat pada class dbUser. Bila sukses maka user akan didaftarkan pada session beserta level aksesnya kemudian akan diarahkan ke halaman yang telah ditentukan sesuai hak aksesnya.
Itulah tutorial authentikasi pada Prado. Contoh diatas hanya contoh sederhana. Masih bisa ditambahkan atau di modifikasi sesuai kebutuhan. Semoga contoh ini bisa membantu dan memperkenalkan Prado pada para programmer web Indonesia. This is Prado Way..




December 6, 2007 at 11:17 pm
yang code application.xml nya gak muncul mas, bisa tolong dibuat lagi gak ya?
January 4, 2008 at 2:03 am
lhaa ini baru mantaff.. conto dengan mysql hahah..tengkiuu…
Nb: rata2 contohnya pake sqlite seh…
July 5, 2008 at 10:26 am
mas…kalo masalah session di prado gmn ya??
mohon bantuanny…
Thankz
July 5, 2008 at 1:55 pm
untuk masalah session ada component prado untuk masalah ini yaitu THTTPSession. Untuk penggunaannya bisa lihat di class documentation di sini untuk penjelasannya. Dan untuk attribute serta method bisa lihat disini.
July 23, 2008 at 1:46 pm
kang tolong di zip dong struktur foldernya n file2nya. agak repot nehh gak ngerti2 maklum baru blajar prado
July 23, 2008 at 1:49 pm
oh iya maap ngerepotin kirim sekalian ke email ku ya kang
thx bgt yaaa
July 24, 2008 at 9:22 am
Filenya wah.. entah dimana.. hehehe.. tutorial ini saya tulis pas waktu saya lagi ga ada kerjaan di kantor. Sekarang saya dah resign dari kantor saya.. jadinya.. ga tau kemana tuh filenya. Kalo mo memulai Prado mungkin bisa melihat beragam how-to cookbook di wiki Prado http://www.pradosoft.com/wiki/index.php/Category:Cookbook
August 15, 2008 at 11:57 pm
oom, ada error TDbConnection failed to establish DB connection: could not find driver.. php ini nya udeh diaktifin semua pdo nya….tapi kok gak bisa yah…
thanks
August 16, 2008 at 12:56 am
kalau error gitu sih pasti drivernya ga ketemu. Coba periksa lagi pastiin driver database keload semua. Jangan lupa restart web servernya agar drivernya bisa digunakan.
August 16, 2008 at 10:57 pm
Thank for quick response…
oom nanya lagi oom, aku coba pake active record, tapi kok
Fatal error: Maximum execution time of 30 seconds exceeded ….
/// contoh
$finder = UserRecord::finder();
$user = $finder->find(‘username = ? ‘,’boongan’);
$this->msg->Text = $user->password;
////
cuma kalo aku pake DAO biasa….kok bisa yah…
///
$connection=new TDbConnection(‘mysql:host=localhost;dbname=test’,'root’,'pass’);
$connection->Active=false;
$connection->Active=true;
$command=$connection->createCommand(‘select * from nothing’);
$dataReader=$command->query();
//blah blah…. ini malah bisa…
kumaha omm….
August 16, 2008 at 11:10 pm
NEVER MIND OOM, IGNORE AJA, DAH BISA….THANKS…oops sorry kapital semua….
August 17, 2008 at 11:02 pm
gpp… dah bisa… sukur deh.. kadang saya suka bingung kalo ditanyain kasus yg blm pernah saya alamin.. tp dah bisa kan? Jd saya ikutan pusing.. hehehe..
October 4, 2008 at 11:58 am
saya mau tanya, bagaimana membuat halaman login dimana saat berhasil login, langsung masuk ke halaman link tertentu.mohon dibalas ke email saya
October 4, 2008 at 11:42 pm
Pada Prado 3.1.2 dimana untuk login kita menggunakan TAuthManager bisa mengisi property ReturnUrl pada class TAuthManager.
Maaf saya tidak membalas ke email tapi langsung disini supaya yang lain bisa baca.
February 25, 2009 at 6:39 am
mas..gimana caranya kalo ada percabangan di prado
maksud sy gini, sy mo tampilin gambar, nama gambar tergantung dari isian di database, misalnya:
kalo isian databasenya 1 maka gambar yg diload satu.gif;
isian 2, gambar yg diload dua.gif;
isian 3, gmbar yg diload tiga.gif
sorry penyampaian pertanyaaannya agak ribet, masih newbie sih…
February 26, 2009 at 8:33 am
Pake switch atau if then else.
Mungkin di controller bisa diset satu variable dimana variable ini merupakan source image untuk component image Prado. Nah nilai tersebut diset sesuai dengan nilai dari database.
April 7, 2009 at 9:35 pm
wow… thanx yah… aku jadi belajar ilmu baru deh
April 15, 2009 at 8:13 am
Thank’s tutorialnya. Saya lagi nyari ini… Moga nanti bisa berhasil…
May 5, 2009 at 12:36 pm
berhasil….!!!
mas..klo untuk membuat grafik di prado gimana codingnya mas???buatin tutornya dong..thanks..