原創|其它|編輯:郝浩|2010-11-16 17:29:45.000|閱讀 766 次
概述:本文主要介紹如何使用 Zend_Auth 和 Zend_Db 實現用戶認證(ZF Study),希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
來記錄一下如何使用 Zend Framework(ZF)來實現用戶的認證操作:
首先先來看看 ZF 手冊對 Zend_Auth 組件的簡介:
Zend_Auth 為認證(authentication)和一些通用用例情景的具體認證適配器提供了一個API。
Zend_Auth 只涉及 認證而不是授權。認證被寬松地定義為基于一些證書(credential)來確定一個實體(例如,身份)是否確實是它所聲稱的。授權是一個過程,它決定是否允許一個實體對其他實體進行訪問、執行操作,它超出了Zend_Auth的范圍。更多關于Zend Framework 授權和訪問控制的信息,參見 Zend_Acl.
Note: Zend_Auth 類通過它的 getInstance()方法實現 Singleton 模式 - 只有一個實例可用。這意味著使用 new 操作符和 clone 關鍵字將不能在Zend_Auth 類中工作,而要使用 Zend_Auth::getInstance() 來代替。
1,數據庫表信息
在我們的 MySQL 里新建一個 phpweb20 數據庫及 users 表,作為測試,建表的 SQL 語句如下所示:
CREATE TABLE `users` (
`user_id` bigint(20) unsigned NOT NULL auto_increment,
`username` varchar(255) NOT NULL,
`password` varchar(32) NOT NULL,
`user_type` varchar(20) NOT NULL,
`ts_created` datetime NOT NULL,
`ts_last_login` datetime default NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `user_id` (`user_id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=gbk
主鍵為 user_id 字段。
2,Zend_Auth 如何工作
首先我們要理解 Zend_Auth 所使用的術語,標識一個用戶的唯一信息稱為其“身份”,用戶成功地認證以后,將其身份存儲在一個 PHP 會話之中,從而在以后的頁面中能夠標識這些用戶。(關于這里的 PHP 會話,Zend_Auth 為此提供了一個 Zend_Auth_Storage_Session 類,而這個類又進一步使用了 Zend_Session 組件,這實際上是 PHP 的 $_SESSION 變量的一個包裝器,而且提供了更強大的功能)
要認證一個用戶,用戶必須提供一個憑證,在我們的例子當中,使用 users 表中的 password 作為用戶的憑證,我們將使用一個適配器根據數據庫來檢查給定的用戶的身份和憑證。這個適配器是 Zend_Auth_Adapter_DbTable 適配器,這個適配器設計為使用 Zend_Db 組件,如果要是想編寫自己的適配器,只需實現一個方法:authenticate() 方法,該方法要返回一個 Zend_Auth_Result 對象。這個對象包含著認證是否成功的有關信息,還包含一些診斷信息。
3,實例化 Zend_Auth
Zend_Auth 是一個單例類,使用靜態的 getInstance() 方法來獲取這個實例,然后必須使用 setStorage() 方法設置存儲類(要注意,我們使用的是 PHP 的會話):
以下代碼用于建立 Zend_Auth 實例:
$auth = Zend_Auth::getInstance();
$auth -> setStorage(new Zend_Auth_Storage_Session());
4,如何完成認證
來說一些具體的關于 Zend_Auth_Adapter_DbTable 的東西:
我們將使用 Zend_Auth_Adapter_DbTable 認證適配器,使用這個適配器之前,必須已經有一個合法的 Zend_Db 對象。它的實例化需要 5 個參數:
> 合法的 Zend_Db 對象($db);
> 所用數據庫表的名(這里使用的是 users);
> 保存用戶身份的列(username 字段);
> 保存用戶憑證的列(password 字段);
> 最后一點,對憑證的處理。這實際上是包裝憑證的一個函數,假如存儲用戶信息的時候,password 字段存放的是用戶密碼的 MD5 散列值,那么我們就要把 md5(?) 作為最后一個參數傳入。此問號只是 Zend_Db 在哪里帶入口令值。
一旦實例化了 Zend_Auth_Adapter_DbTable ,就可以設置身份(username)和憑證(password)了,為此要使用 setIdentity() 和 setCredential() 方法。接下來,在 $auth 對象(Zend_Auth 的實例)上調用 authenticate() 方法,而傳入 anthenticate() 方法的唯一參數是適配器($adapter),通過它來返回一個 Zend_Auth_Result 的一個實例。還可以通過調用 Zend_Auth_Result 對象的 isValid() 方法來查看用戶是否通過了認證,還可以調用其他的方法來查看錯誤信息。
實現代碼如下:
<?php
/**
* 使用 Zend_Auth 和 Zend_Db 實現用戶認證
*/
//啟用 ZF 的自動調用機制(必備的一步)
require_once('Zend/Loader/Autoloader.php');
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
//數據庫配置數組
$params = array('host' => 'localhost',
'username' => 'root',
'password' => 'password',
'dbname' => 'phpweb20'
);
$db = Zend_Db::factory('pdo_mysql', $params);
//初始化 Zend_Auth 組件
$auth = Zend_Auth::getInstance();
$auth -> setStorage(new Zend_Auth_Storage_Session());
//初始化認證適配器
$adapter = new Zend_Auth_Adapter_DbTable($db, 'users', '
username', 'password', 'md5(?)');
//設置身份
$adapter -> setIdentity('fakeUsername');
//設置密碼
$adapter -> setCredential('fakePassword');
//驗證
$result = $auth -> authenticate($adapter);//返回 Zend_Auth_Result 實例
if($result -> isValid())
{
//登錄成功
echo "Succeed!";
}
else
{
//登錄失敗
switch($result -> getCode())
{
case Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:
echo 'Identity not found!';
break;
case Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS:
echo 'Multiple users found with this identity!';
break;
case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
echo 'Invalid password!';
break;
default:
var_dump($result -> getMessages());
}
}
?>
其實還可以使用 $auth 對象來檢查一個用戶是否通過認證。hasIdentity() 方法指示一個用戶是否通過認證,為了確定用戶的具體身份,可以使用 getIdentity() 方法。類似地,可以使用 clearIdentity() 方法來注銷用戶,如果使用 PHP 會話作為存儲方法,實際上,這會從會話中刪除指定用戶的身份。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:軟件開發網