Zend Auth với ví dụ login - logout
Zend Auth là một lớp cung cấp cho chúng ta nhiều phương thức xử lý giúp chúng ta đơn giản hóa thực hiện quá trình chứng thực tài khoản có trong hệ thống ứng dụng. Zend Auth hỗ trợ cho chúng ta trong quá trình đăng nhập, thoát và lấy các thông tin cần thiết của tài khoản người sử dụng đang đăng nhập. Zend_Auth không là một lớp riêng lẻ mà nó kết hợp giữa các lớp khác nhau như Zend_Db_Table, Zend_Session để hình thành.
Để bắt đầu làm làm và hiểu về ví dụ Zend_Auth. Các bạn hãy download tài liệu về lý thuyết của Zend Auth tại đây.
Để thực hiện ứng dụng login – logout bằng Zend Author chúng ta sẽ bao gồm những bước sau:
1. Tạo kết nối Database trong Bootstrap của ứng dụng
2. Tạo hàm preDispatch() chuyển hướng user nếu chưa login
3. Tạo loginAction, sử dụng Zend Auth để kiểm tra tài khoản
4. Tạo indexAcion
5. Tạo logoutAction
Tạo database với bảng users có dữ liệu như sau:
CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(32) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(150) COLLATE utf8_unicode_ci NOT NULL, `full_name` varchar(150) COLLATE utf8_unicode_ci NOT NULL, `status` tinyint(1) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ; -- -- Dumping data for table `users` -- INSERT INTO `users` (`id`, `username`, `password`, `email`, `full_name`, `status`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 'admin@yahoo.com', 'Administrator', 1), (2, 'KhanhPham', 'e10adc3949ba59abbe56e057f20f883e', 'vukhanh2212@gmail.com', 'Pham Vu Khanh', 0);
username: admin, KhanhPham
password: 123456
1. Tạo kết nối Database trong Bootstrap của ứng dụng
Mở tập tin Bootstrap.php của ứng dụng thêm vào hàm _initDb(). (Xem lý thuyết mục 1)
protected function _initDb() {
$dbOption = $this->getOption('resources');
$dbOption = $dbOption['db'];
// Setup database
$db = Zend_Db::factory($dbOption['adapter'], $dbOption['params']);
$db->setFetchMode(Zend_Db::FETCH_ASSOC);
$db->query("SET NAMES 'utf8'");
$db->query("SET CHARACTER SET 'utf8'");
Zend_Registry::set('connectDB', $db);
//Khi thiet lap che do nay model moi co the su dung duoc
Zend_Db_Table::setDefaultAdapter($db);
// Return it, so that it can be stored by the bootstrap
return $db;
}
2. Tạo hàm preDispatch() chuyển hướng user nếu chưa login
Khi user chưa đăng nhập vào tài khoản thì chúng ta sẽ cho user chuyển hướng đến trang login (Xem lý thuyết mục 10 và 13)
Tạo hàm preDispatch() trong IndexController với nội dung như sau
public function preDispatch() {
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
if ($this->_request->getActionName() != 'login') {
$this->_redirect('/index/login');
}
}
}
3. Tạo loginAction để kiểm tra dữ liệu từ Form đăng nhập
Tạo một form login trong phần VIEW của loginAction sau đó gửi dữ liệu vào loginAction kiểm tra xem có tồn tại hay không. (Xem lý thuyết từ mục 2 đến mục 9)
public function loginAction() {
if ($this->_request->isPost()) {
//1.Goi ket noi voi Zend Db
$db = Zend_Registry::get('connectDB');
//$db = Zend_Db::factory($dbOption['adapter'],$dbOption['params']);
//2. Khoi tao Zend Autho
$auth = Zend_Auth::getInstance ();
//3. Khai bao bang va 2 cot se su dung so sanh trong qua tronh login
$authAdapter = new Zend_Auth_Adapter_DbTable($db);
$authAdapter->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password');
//4. Lay gia tri duoc gui qua tu FORM
$uname = $this->_request->getParam('username');
$paswd = $this->_request->getParam('password');
//5. Dua vao so sanh voi du lieu khai bao o muc 3
$authAdapter->setIdentity($uname);
$authAdapter->setCredential(md5($paswd));
//6. Kiem tra trang thai cua user neu status = 1 moi duoc login
$select = $authAdapter->getDbSelect();
$select->where('status = 1');
//7. Lay ket qua truy van
$result = $auth->authenticate($authAdapter);
$flag = false;
if ($result->isValid()) {
//8. Lay nhung du lieu can thiet trong bang users neu login thanh cong
$data = $authAdapter->getResultRowObject(null, array('password'));
//9. Luu nhung du lieu cua member vao session
$auth->getStorage()->write($data);
$flag = true;
}
if ($flag == true) {
$this->_redirect('/index/index');
}
}
}
Biến $flag trong phần này có tác dụng nếu login thành công biến $flag sẽ có giá trị true. Khi có giá trị true thì tự động chuyển đến indexAction(). Nếu giá tri fasle sẽ vẫn ở loginAction()
Tạo VIEW của loginAction() và đưa vào nội dung sau:
<?php
$username = $this->formText('username', '', array('style' => 'width: 150px'));
$password = $this->formText('password', '', array('style' => 'width: 150px'));
$btnButton = $this->formSubmit('submit', 'Login');
?>
<h2>loginAction</h2>
<form id="appForm" action="" method="POST" enctype="multipart/form-data">
Username: <?php echo $username; ?>
<br></br>
Password: <?php echo $password; ?>
<br></br>
<?php echo $btnButton; ?>
</form>
4. Tạo indexAction
Tạo indexAction. Action này đơn giản chỉ có chức năng truy cập vào session của Zend Auth và lấy ra tên của user đã login sau đó truyền ra ngoài VIEW của action này. (Xem lý thuyết mục 11)
public function indexAction() {
$auth = Zend_Auth::getInstance();
$infoUser = $auth->getIdentity();
$this->view->fullName = $infoUser->full_name;
}
Tạo VIEW cho indexAction() với nội dung sau:
<h2>indexAction</h2>
Hi <?php echo $this->fullName;?>!
<br></br>
<a href="<?php echo $this->baseUrl("/index/logout");?>">Logout</a>
5. Tạo logoutAction
Để thoát khỏi hệ thống chúng ta chỉ cần xóa điều kiện chứng thực của Zend Auth. (Xem lý thuyết mục 12)
Tạo logoutAction() với nội dung sau:
public function logoutAction() {
$auth = Zend_Auth::getInstance();
$auth->clearIdentity();
}
Tạo VIEW cho logoutAction() với nội dung sau:
<h2>logoutAction</h2>
Bạn đã login khỏi hệ thống
<br></br>
Nhấn vào đây để vào thử indexAction()
<a href="<?php echo $this->baseUrl("/index/logout");?>">Index</a>
Chúc các bạn thành công.
bởi Đức Thọ
Ngày 11/05/2012 vào lúc 15:32:13- 1.cám ơn thầy nhiều.
- 2.Hướng dẫn rất chất lượng. Đã hướng dẫn ít ra phải như thế này dân mù tịt như em mới rõ ngọn rõ...
- 3.Tiếng Anh thì >>thông cãm
- 4.fafa
- 5.Mình đã fix được rồi. Thanks bạn nhiều lắm !
- 6.Dịch vụ quá nguy hiểm... Giờ mới biết Vinaphone có cái dịch vụ "Giết người" này. Nếu biết từ trước...
- 7.cung hay day nhi...
- 8.NGƯỜI TA ĐÃ TỰ BIẾT DỊP TẾT LÀ HAY NGHẼN MẠNG VẬY NHÀ MẠNG LÀM NHƯ THẾ NÀY LÀ CƯỚP KHUYẾN MẠI CỦA...
- 9.Nhóm cuối cùng có lẽ là đáng ngạc nhiên, hoặc có lẽ hoàn toàn rõ ràng - đó là chính phủ. Một câu hỏi...
- 10.Nhóm cuối cùng có lẽ là đáng ngạc nhiên, hoặc có lẽ hoàn toàn rõ ràng - đó là chính phủ. Một câu hỏi...
- 1.Cài đặt và cấu hình ứng dụng Zend Framework (video...
- 2.Lập trình hướng đối tượng trong PHP (video...
- 3.Lập trình hướng đối tượng trong PHP 5 ( PHP OOP )
- 4.Zend Auth với ví dụ login - logout
- 5.Tài liệu Zend Framework
- 6.Hàm xử lý ngày tháng (Date and Time php function)
- 7.Webserver - Hướng dẫn cài đặt và sử dụng Xampp
- 8.Zend_Db - Những phương thức cơ bản
- 9.Các kiểu lập trình trong PHP (Phần 1)
- 10. Zend_Framework & JQuery ajax phân trang
- xin code bat dong san bang php zend framework
- Help help help
- hướng dẫn tối ưu url bằng file htaccess
- mã hóa khó hiểu
- Tuyển 05 Lập Trình Viên PHP
- confix phpmailer host linux
- Học.Viên.Mới.Xin.Giúp.Đỡ!!!!
- Cho mình về validate số điện thoại
- Hướng dẫn sử dụng lệnh YUM trong Linux
- Bị loop khi dùng session





bởi Mr.HD
Ngày 14/04/2012 vào lúc 10:46:46Tuy nhiên khi em làm theo hướng dẫn thì chỉ login in được bằng tài khoản admin. Còn tài khoản KhanhPham thì không được.
Kể cả mã nguồn mà em đã download về cũng vậy. Tại sao vậy thầy?
Em xin hỏi thêm: trong php thuần + MySQL thì phải sử dụng câu lệnh select để so sánh username và password. Nhưng trong Zend thì không thấy câu lệnh tương đương select. Vậy tại sao vẫn thực hiện so sánh được?
bởi Mr.L
Ngày 14/04/2012 vào lúc 11:50:53$authAdapter->setIdentity($uname);
$authAdapter->setCredential(md5($paswd));
2 câu lệnh này là để set username và password vào Zend_auth, trong class này đã viết sẳn cơ chế chứng thực(cũng là so sánh thôi) bạn có thể vào class đó để xem chi tiết