原創(chuàng)|其它|編輯:郝浩|2010-11-16 17:29:45.000|閱讀 766 次
概述:本文主要介紹如何使用 Zend_Auth 和 Zend_Db 實(shí)現(xiàn)用戶認(rèn)證(ZF Study),希望對(duì)大家有幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
來(lái)記錄一下如何使用 Zend Framework(ZF)來(lái)實(shí)現(xiàn)用戶的認(rèn)證操作:
首先先來(lái)看看 ZF 手冊(cè)對(duì) Zend_Auth 組件的簡(jiǎn)介:
Zend_Auth 為認(rèn)證(authentication)和一些通用用例情景的具體認(rèn)證適配器提供了一個(gè)API。
Zend_Auth 只涉及 認(rèn)證而不是授權(quán)。認(rèn)證被寬松地定義為基于一些證書(credential)來(lái)確定一個(gè)實(shí)體(例如,身份)是否確實(shí)是它所聲稱的。授權(quán)是一個(gè)過(guò)程,它決定是否允許一個(gè)實(shí)體對(duì)其他實(shí)體進(jìn)行訪問(wèn)、執(zhí)行操作,它超出了Zend_Auth的范圍。更多關(guān)于Zend Framework 授權(quán)和訪問(wèn)控制的信息,參見(jiàn) Zend_Acl.
Note: Zend_Auth 類通過(guò)它的 getInstance()方法實(shí)現(xiàn) Singleton 模式 - 只有一個(gè)實(shí)例可用。這意味著使用 new 操作符和 clone 關(guān)鍵字將不能在Zend_Auth 類中工作,而要使用 Zend_Auth::getInstance() 來(lái)代替。
1,數(shù)據(jù)庫(kù)表信息
在我們的 MySQL 里新建一個(gè) phpweb20 數(shù)據(jù)庫(kù)及 users 表,作為測(cè)試,建表的 SQL 語(yǔ)句如下所示:
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 所使用的術(shù)語(yǔ),標(biāo)識(shí)一個(gè)用戶的唯一信息稱為其“身份”,用戶成功地認(rèn)證以后,將其身份存儲(chǔ)在一個(gè) PHP 會(huì)話之中,從而在以后的頁(yè)面中能夠標(biāo)識(shí)這些用戶。(關(guān)于這里的 PHP 會(huì)話,Zend_Auth 為此提供了一個(gè) Zend_Auth_Storage_Session 類,而這個(gè)類又進(jìn)一步使用了 Zend_Session 組件,這實(shí)際上是 PHP 的 $_SESSION 變量的一個(gè)包裝器,而且提供了更強(qiáng)大的功能)
要認(rèn)證一個(gè)用戶,用戶必須提供一個(gè)憑證,在我們的例子當(dāng)中,使用 users 表中的 password 作為用戶的憑證,我們將使用一個(gè)適配器根據(jù)數(shù)據(jù)庫(kù)來(lái)檢查給定的用戶的身份和憑證。這個(gè)適配器是 Zend_Auth_Adapter_DbTable 適配器,這個(gè)適配器設(shè)計(jì)為使用 Zend_Db 組件,如果要是想編寫自己的適配器,只需實(shí)現(xiàn)一個(gè)方法:authenticate() 方法,該方法要返回一個(gè) Zend_Auth_Result 對(duì)象。這個(gè)對(duì)象包含著認(rèn)證是否成功的有關(guān)信息,還包含一些診斷信息。
3,實(shí)例化 Zend_Auth
Zend_Auth 是一個(gè)單例類,使用靜態(tài)的 getInstance() 方法來(lái)獲取這個(gè)實(shí)例,然后必須使用 setStorage() 方法設(shè)置存儲(chǔ)類(要注意,我們使用的是 PHP 的會(huì)話):
以下代碼用于建立 Zend_Auth 實(shí)例:
$auth = Zend_Auth::getInstance();
$auth -> setStorage(new Zend_Auth_Storage_Session());
4,如何完成認(rèn)證
來(lái)說(shuō)一些具體的關(guān)于 Zend_Auth_Adapter_DbTable 的東西:
我們將使用 Zend_Auth_Adapter_DbTable 認(rèn)證適配器,使用這個(gè)適配器之前,必須已經(jīng)有一個(gè)合法的 Zend_Db 對(duì)象。它的實(shí)例化需要 5 個(gè)參數(shù):
> 合法的 Zend_Db 對(duì)象($db);
> 所用數(shù)據(jù)庫(kù)表的名(這里使用的是 users);
> 保存用戶身份的列(username 字段);
> 保存用戶憑證的列(password 字段);
> 最后一點(diǎn),對(duì)憑證的處理。這實(shí)際上是包裝憑證的一個(gè)函數(shù),假如存儲(chǔ)用戶信息的時(shí)候,password 字段存放的是用戶密碼的 MD5 散列值,那么我們就要把 md5(?) 作為最后一個(gè)參數(shù)傳入。此問(wèn)號(hào)只是 Zend_Db 在哪里帶入口令值。
一旦實(shí)例化了 Zend_Auth_Adapter_DbTable ,就可以設(shè)置身份(username)和憑證(password)了,為此要使用 setIdentity() 和 setCredential() 方法。接下來(lái),在 $auth 對(duì)象(Zend_Auth 的實(shí)例)上調(diào)用 authenticate() 方法,而傳入 anthenticate() 方法的唯一參數(shù)是適配器($adapter),通過(guò)它來(lái)返回一個(gè) Zend_Auth_Result 的一個(gè)實(shí)例。還可以通過(guò)調(diào)用 Zend_Auth_Result 對(duì)象的 isValid() 方法來(lái)查看用戶是否通過(guò)了認(rèn)證,還可以調(diào)用其他的方法來(lái)查看錯(cuò)誤信息。
實(shí)現(xiàn)代碼如下:
<?php
/**
* 使用 Zend_Auth 和 Zend_Db 實(shí)現(xiàn)用戶認(rèn)證
*/
//啟用 ZF 的自動(dòng)調(diào)用機(jī)制(必備的一步)
require_once('Zend/Loader/Autoloader.php');
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
//數(shù)據(jù)庫(kù)配置數(shù)組
$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());
//初始化認(rèn)證適配器
$adapter = new Zend_Auth_Adapter_DbTable($db, 'users', '
username', 'password', 'md5(?)');
//設(shè)置身份
$adapter -> setIdentity('fakeUsername');
//設(shè)置密碼
$adapter -> setCredential('fakePassword');
//驗(yàn)證
$result = $auth -> authenticate($adapter);//返回 Zend_Auth_Result 實(shí)例
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());
}
}
?>
其實(shí)還可以使用 $auth 對(duì)象來(lái)檢查一個(gè)用戶是否通過(guò)認(rèn)證。hasIdentity() 方法指示一個(gè)用戶是否通過(guò)認(rèn)證,為了確定用戶的具體身份,可以使用 getIdentity() 方法。類似地,可以使用 clearIdentity() 方法來(lái)注銷用戶,如果使用 PHP 會(huì)話作為存儲(chǔ)方法,實(shí)際上,這會(huì)從會(huì)話中刪除指定用戶的身份。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:軟件開(kāi)發(fā)網(wǎng)