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>

Download mã nguồn

Chúc các bạn thành công.

avata

bởi Mr.HD

Ngày 14/04/2012 vào lúc 10:46:46
Bài viết của thầy rất hay !
Tuy 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?
avata

bởi Mr.L

Ngày 14/04/2012 vào lúc 11:50:53
Bạn vào db xem KhanhPham có ACP là 1 hay ko, vì chỉ có những account có quyền vào admin mới vào được bạn ak.

$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
avata

bởi Đức Thọ

Ngày 11/05/2012 vào lúc 15:32:13
Link down mã nguồn bị die rồi , làm ơn up lại được không ?