Membuat Halaman LoginUser

Halaman LoginUser menampilkan formulir masuk dan mengotentikasi pengguna yang mencoba untuk masuk. Seperti dijelaskan dalam otentikasi dan otorisasi, browser pengguna secara otomatis dialihkan ke halaman LoginUser ketika pengguna mencoba untuk mengakses halaman istimewa, seperti misalhnya halaman admin pengguna.

Alur kerja LoginUser sangat mirip dengan halaman Contact:

  1. Ketika pengguna mengakses halaman LoginUser, formulir masuk ditampilkan;
  2. Pengguna mengisi nama pengguna dan kata sandi serta mengklik pada tombol "login";
  3. LoginUser menerima event "login" dan memicu rangkaian otentikasi;
  4. Jika pengguna memasukan nama pengguna dan kata sandi yang benar, sistem menempatkan identitas yang sah dan mengalihkan browser-nya ke halaman istimewa yang diinginkan; Jika tidak, pesan "password invalid" akan ditampilkan.

Kita membuat dua file protected/pages/users/LoginUser.page dan protected/pages/users/LoginUser.php masing-masing untuk menyimpan template halaman dan kelas halaman.

Membuat Template Halaman

Di bawah ini kita menampilkan template untuk LoginUser. Seperti kita lihat, halaman sebagian besar berisi kotak teks untuk mengumpulkan nama pengguna dan kotak teks untuk kata sandi. Input nama pengguna diperlukan, yang dipastikan oleh TRequiredFieldValidator. Kebenaran dari input kata sandi dipastikan oleh TCustomValidator yang memanggil metode validateUser() halaman ketika validasi dilakukan. Halaman juga mempunyai tombol "login" yang memanggil loginButtonClicked() halaman ketika itu diklik.

<%@ Title="My Blog - Login" %> <com:TContent ID="Main">

Login

Username: <com:TRequiredFieldValidator ControlToValidate="Username" ErrorMessage="Please provide your username." Display="Dynamic" />
<com:TTextBox ID="Username" />
Password: <com:TCustomValidator ControlToValidate="Password" ErrorMessage="Your entered an invalid password." Display="Dynamic" OnServerValidate="validateUser" />
<com:TTextBox ID="Password" TextMode="Password" />
<com:TButton Text="Login" OnClick="loginButtonClicked" /> </com:TContent>

Membuat Kelas Halaman

Seperti halaman Contact, halaman LoginUser juga memerlukan file kelas yang sebagian besar berisi implementasi pengendali event yang disertakan dalam template halaman. Di sini, kita perlu mengimplementasikan dua metode: validateUser() dan loginButtonClicked(). Dalam validateUser(), kita menggunakan manajer otentikasi untuk memverifikasi apakan nama pengguna serta kata sandinya sudah benar. Jika benar, manajer otentikasi akan secara otomatis membuat sesi pengguna dengan informasi identitas pengguna terkait.

class LoginUser extends TPage { /** * Validates whether the username and password are correct. * This method responds to the TCustomValidator's OnServerValidate event. * @param mixed event sender * @param mixed event parameter */ public function validateUser($sender,$param) { $authManager=$this->Application->getModule('auth'); if(!$authManager->login($this->Username->Text,$this->Password->Text)) $param->IsValid=false; // beritahu validator bawa validasi gagal } /** * Redirects the user's browser to appropriate URL if login succeeds. * This method responds to the login button's OnClick event. * @param mixed event sender * @param mixed event parameter */ public function loginButtonClicked($sender,$param) { if($this->Page->IsValid) // semua validasi sukses { // Dapatkan URL pada halaman istimewa yang diinginkan pengguna yang akan dikunjungi $url=$this->Application->getModule('auth')->ReturnUrl; if(empty($url)) // pengguna mengakses halaman masuk secara langsung $url=$this->Service->DefaultPageUrl; $this->Response->redirect($url); } } }

Pengujian

Kita telah membuat halaman LoginUser. Kita dapat mengujinya dengan mengunjungi URL http://hostname/blog/index.php?page=users.LoginUser. Ingat dalam subbagian Membuat Database, kita sudah membuat dua akun pengguna (username/password): admin/demo dan demo/demo. Kita dapat menggunakannya untuk menguji halaman masuk kita.

Menambahkan Link Login/Logout ke Master

Guna melengkapi cara langsung bagi pengguna untuk masuk dan keluar, kita memodifikasi sedikit kontrol master MainLayout. Dalam keadaan tertentu, kita menambahkan hiperlink "login" yang mengaitkan halaman LoginUser. Kita juga menambahkan tombol link "logout" yang mengeluarkan pengguna saat ia diklik.

Kita memodifikasi bagian footer dari template MainLayout sebagai berikut. Penampakan "login" dan "logout" ditentukan berdasarkan status pengguna. Jika pengguna belum masuk, misalnya $this->User->IsGuest adalah true, link "login" terlihat sementara link "logout" tidak; dan begitu sebaliknya.

Karena tombol "logout" menempelkan event OnClick dengan metode yang dipanggil logoutButtonClicked(), kita juga perlu mengubah file kelas MainLayout.

class MainLayout extends TTemplateControl { /** * Logs out a user. * This method responds to the "logout" button's OnClick event. * @param mixed event sender * @param mixed event parameter */ public function logoutButtonClicked($sender,$param) { $this->Application->getModule('auth')->logout(); $url=$this->Service->constructUrl($this->Service->DefaultPage); $this->Response->redirect($url); } }

Sekarang jika kita mengunjungi setiap halaman pada sistem blog kita, kita akah melihat apakah ada link di bawah halaman. Link menampilkan "Login" jika kita belum masuk dan "Logout" jika telah masuk. Jika kita mengklik pada "Logout", browser akan mengalihkannya ke homepage dan "Login" ditampilkan yang berarti kita sudah dikeluarkan.