Trang

Thứ Năm, 18 tháng 7, 2013

Chứng thực đăng nhập với Zend_Auth [Zend Framework]

Zend hỗ trợ chúng ta việc chứng thực thông tin người dùng thông qua đối tượng Zend_Auth. Đối tượng này sẽ nhận thông tin từ người dùng và kiểm tra với dữ liệu được chỉ định trong cơ sở dữ liệu để kiểm tra sự hợp lệ.
I. Lý thuyết

Để sử dụng Zend_Auth ta làm quen với các khái niệm sau:
- tableName : tên bảng chứa thông tin chứng thực (thường là bảng thanhvien hay user trong CSDL).
- indentityColumn : tên cột nhận dạng (thường là username) trong bảng thông tin chứng thực.
- credentialColumn : tên cột nhận dạng bí mật (thường là password) trong bảng thông tin chứng thực.
- identity : nhận giá trị từ textfiel username để chúng ta so sánh với identityColumn.
- credential : nhận giá trị từ textfiel password để chúng ta so sánh với credentialColumn.

Bước 1: Chỉ ra bảng chứa thông tin chứng thực
$authTable = new Zend_Auth_Adapter_Dbtable();
$authTable->setTableName(' tên_bảng_chứa_thông_tin_chứng_thực ');
$authTable->setIdentityColumn(' tên_cột_nhận_dạng ');
$authTable->setCredentialColumn(' tên_cột_chứa_thông_tin_bí_mật ');

Bước 2: Đưa các giá trị nhận được từ textfiel vào identity và credential
$authTable->setIdentity(' dữ_liệu_của_identity_đầu_vào ');
$authTable->setCredential(' dữ_liệu_credential_đầu_vào ');

Bước 3: Tạo truy vấn
$authTable->getDbSelect()->where(' active = 1 ');

Bước 4: Khởi tạo chứng thực và lấy kết quả chứng thực
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authTable);

Bước 5: Kiểm tra chứng thực thành công hay thất bại và xử lý
if( $result->isValid() )
 {
     //chứng thực thành công
 }else{
            // chứng thực thất bại 
        }

Nếu chứng thực thành công:
// Lấy dữ liệu tất cả các cột, trừ cột password
$getUserData = $authTable->getResultRowObject(null,array('password'));

// Lấy một vài cột
$getUserData = $authTable->getResultRowObject(array('username','hoten','level'));

Bước 7: Ghi dữ liệu chứng thực vào Session
$auth->getStorage()->write($getUserData);

Để lấy dữ liệu chứng thực từ các Action() khác:
$auth = Zend_Auth::getInstance();
if( $auth->hasIdentity() )
 {
      $infoUser = $auth->getIdentity();
      $this->view->username = $infoUser->username;
 }

II. Ứng dụng đăng nhập với Zend_Auth

Bước 1: Tạo form đăng nhập
Vào thư mục forms tạo một file tên login.php với nội dung sau
<?php
class Form_Login extends Zend_Form
 {
       public function init()
        {
             //Username
             $this->addElement('text','username',array(
                                                    'label'=>'Username',
                                                    'size'=>21,
                                                    ));
             $username = $this->getElement('username');
             //Validate
             //NotEmpty
             $username->setRequired(true)
                   ->addValidator('NotEmpty',true)
                    ->getValidator('NotEmpty')->setMessage('Username không được bỏ trống.');
             //Khong co dau, khoảng trắng và các kí tự đặc biệt
             $username->addValidator('Regex',true,array('/^[a-zA-Z0-9]*$/'))
                   ->getValidator('Regex')->setMessage('Username không hợp lệ.'); //vì là Login nên để không hợp lệ
             //Filter
             $username->addFilter('Stringtrim')
                   ->addFilter('StringToLower');
             //End Username
             
             //Password
             $this->addElement('password','password',array(
                                                           'label'=>'Password',
                                                           'size'=>21
                                                           ));
             $password=$this->getElement('password');
             //Validate
             //NotEmpty
             $password->setRequired(true)
                      ->addValidator('NotEmpty')
                      ->getValidator('NotEmpty')->setMessage('Password không được bỏ trống');
             //Khong co dau, khoảng trắng và các kí tự đặc biệt
             $password->addValidator('Regex',true,array('/^[a-zA-Z0-9]*$/'))
                      ->getValidator('Regex')->setMessage('Password không hợp lệ.');
            //Filter
            $password->addFilter('StringTrim')
                     ->addFilter('StringToLower');
             //End password
             
             //Submit
             $this->addElement('submit','login',array('label'=>'Login'));
             //End Submit
        }
 }

Bước 2: Trong Controller tạo loginAction()
public function loginAction()
 {
    $formLogin= new Form_Login(array('name'=>'formLogin','id'=>'formLogin','action'=>'','method'=>'post'));
    // nếu có submit
    if($this->_request->getPost('login') )
       {
          if($formLogin->isValid($this->_request->getPost()))
            {   
               // Một khi vào tới đây thì username và password không được trống
               $arrayData=$formLogin->getValues();// Lấy giá trị từ form
               // Chứng thực với Zend_Auth
               // 1. Khởi tạo đối tượng và chỉ ra tên bảng chứa thông tin chứng thực
                      $authTable = new Zend_Auth_Adapter_Dbtable();
                      $authTable->setTableName('thanhvien') // Tên bảng để chứng thực
                                ->setIdentityColumn('username') // Tên cột nhận dạng
                                ->setCredentialColumn('password'); // Tên cột nhận dạng bí mật
                      
              // 2. Lấy dữ liệu từ form và đưa vào identity và credential
                      $authTable->setIdentity($arrayData['username'])
                                ->setCredential($arrayData['password']);
             // 3. Truy vấn cơ sở dữ liệu
                      $authTable->getDbSelect()->where('Actived = 1');
             // 4. Khởi tạo chứng thực và lấy kết quả chứng thực
                      $auth = Zend_Auth::getInstance();
                      $result = $auth->authenticate($authTable);
            // 5. Kiểm tra chứng thực thành công hay thất bại và xử lý
                      if($result->isValid())
                       {
                           // Lấy tất cả các dữ liệu trừ cột password
                           $getInfo = $authTable->getResultRowObject(null,array('password'));
                           // Ghi dữ liệu đã chứng thực vào session
                           $auth->getStorage()->write($getInfo);
                           $this->_redirect(HOST_PATH.'/index/welcome');
                           
                       }else{
                                 $this->_redirect(HOST_PATH.'/index/login');   
                            }
                      
                      //End chứng thực với Zend_Auth
                               
            }// end validate form
     }//end submit
   $this->view->formLogin=$formLogin;
}//end function loginAction()

Bước 3: Trong View
<?php
echo $this->formLogin;
?>

Bước 4: Viết welcomeAction()
public function welcomeAction()
         {
             $auth = Zend_Auth::getInstance();
             if($auth->hasIdentity())
               {
                  $userInfo = $auth->getIdentity();
                  $this->view->username = $userInfo->username;
               }else{
                       $this->_redirect(HOST_PATH.'/index/login');
                    }
         }

Nguồn: Sưu tầm Internet

1 nhận xét:

  1. admin ơi cho em hỏi là mình có cần tải và cài hay gọi qua use zend_auth không ạ hay là zend_auth có sẵn trong bản cài zend rồi và mình cứ như vậy rồi dùng thôi ạ @@

    Trả lờiXóa