1、 Zend-Auth 认证(authentication)提供一个api并包括了一些通用用例情景的具体认证适配器
Zend_Auth适配器都实现一个zend_auth_adapter_interface 这个interface定义了一个方法authenticate()
class myauthadapter implements zend_auth_adapter_interface
{
public function __construct($username,$password){
//....
}
public function authenticate(){
//...
}
}
2、通用zend_auth适配器结果操作
isvalid()--返回true表示一个成功的认证尝试
getcode()--返回一个zend_auth_resulet常量标识符用来决定认证失败的类型或者是否认证成功
getIdentity()--返回认证尝试的身份
getmessages()--返回关于认证尝试失败的数组
zend_auth_result::success
zend_auth_result::failure
zend_auth_result::failure_identity_not_found
zend_auth_result::failure_identity_ambiguous
zend_auth_result::failure_credential_invalid
zend_auth_result::failure_uncategorized
例子是如何分支化结果代码:
$reslut=$this->_auth->authenticate($adapter);
switch($result->getcode()){
case zend_auth_result::falilure_identity_not_found:
//** do stuff for nonexistent identity**//
break;
case zend_auth_result::failure_invalid_credential:
/do stuff for invalid credential
break;
case zend_auth_result::success:
/*do stuff for successful authentication
break;
default:
do stuff for other failure
break;
}
3、身份的持久(persistence)
zend_auth::authenticate()通过把认证结果放入持久存贮中来保存身份
用zend_auth_storage_session存贮类,这个类使用zend_session通过zend-auth_storage-interface给zend_auth::setStorage()提供对象
例子:
require_once 'zend/auth.php';
$auth=zend_auth::getinstance();
require_once 'zend/auth/storage/session.php';
$auth->setstorage(new zend_auth_storage-session('somenamespace'));
$result=$auth->authenticate($authadapter);
/** todo set up the auth adapter,$authadapter **/
$auth=zend_auth::getinstance();
4、实现定制存贮
有时开发者需要不同的身份持久,而不是zend_auth-storage_session提供的,这样可以简单实现zend_auth_storage_interface并给zend_auth::setStorage()提供一个类的实例。
例子;
require_once zend/auth/storage/interface.php
calss mystorage implements zend_auth_storage_interface
{
public function isEmpty()
{
//todo implementation
}
public function read()
public function write()
public clear()
为使用定制的存储类,在认证查询被尝试前,zend-auth::setstorage()被调用
如:zend_auth::getinstance()->setstorage(new mystorage());
$result=zend_auth::getinstance()->authenticate($authadapter);
}
5、使用zend_auth适配器
两种使用方法:非直接,通过zend_auth::authenticate()
直接,通过适配器的authenticate()方法
非直接使用适配器的例子:
// get a reference to the singleton instance of zend-auth
require_once 'zend/auth.php'
$auth=zend_auth::getinstance();
//set up the authentication adapter
$authadapter=new myauthadapter($nusername,$password);
//attempt authentication ,saving the result
$result=$auth->authenticate($authadapter);
if(!result->isvalid()){
foreache($result->getmessages() as $mesage){
echo "$meaage\n;
}
}else{
//authentication succeede;the identity ($username) is stored in the session
//$result->getidentity()===$auth->getidentity()
//$result->getindentity()===$username
}
在请求里的认证被尝试:
$auth=zend_auth::getInstance();
if($auth->hasidentity()){
$identity=$auth->getIdentity();
}
除去身份:
zend_auth::getinstance()->clearIdentity();
直接是使用适配器需要配置和准备适配器对象和调用他的authenticate()方法
直接使用例子:
$authadapter=new myauthadapter($username,$password);
$result=$authadapter->authenticate();
if(!result->isvalid()){
//authentication failed;print the reasons why
foreach($result->getmessages() as $message){
echo $message\n;
}else{
//authentication succeeded
//$result->getidentity()===$uername
}
}
6、用数据库表认证
zend_auth_adapter_dbtable提供依靠存贮在数据库表中的证书来认证的能力,他要跟zend_db_adapter_abstract的实例来传给他构造器,每个实例要和特定的数据库绑定。
可用配置选项:
tablename:表名
identitycolumn:表列名,表示身份
credentialcolumn:表示证书,证书只密码
credentialtreatment:
例子:
//创建一个in-memory sqlite数据库连接
require_once zend/db/adapter/pdo/sqlite.php;
$dbadapter=new zend_db_adapter_pdo_sqlite(array(dbname=>:memory:));
//创建一个简单表
$sqlcreate=create table[users]([id] integer not null primary key,
[username] varchar(50) unique not null,
[password] varchar(32) null,
[real_name] varchar(150) null );
$dbadapter->query($sqlcreate);
//构造一个可以认证的数据语句
$sqlinsert=insert into users(suername,password,real_name)
values my_username,my_password ,my real name);
$dbadapter->query($sqlinsert);
//创建zend_auth_adapter_dbtable
require_once zend/auth/adapter/dbtable.php
$authadapter=new zend_auth-adapter_dbtable($dbadapter,users,username,password);
//用setter方法配置实例
$authadapter=new zend_auth_adapter_dbtable($dbadapter);
$authadapter->settablename(users)
->setidentitycloumn(username)
->setcredentialcolmn(passoword);
// 设置输入的证书的值(从登陆的表单)
$authadapter->setidentity(my_username)
->setcrdential(my_password);
//执行认证查询,并保存结果
$result=$authadapter->authenticate();
输出结果
$result->getidentity()
print-r($identity);
持久一个 DBtable结果对象
// authenticate with zend_auth_adapter-dbtable
$result=$this->_auth->authenticate($adapter);
if($result->isvalid()){
$this->_auth->getstorage()->write($adapter->getresultrowobject(array(username,real-anme)));
$this-._auth->getstorage()->write($adapter->getresultRowobject(null,password))
}else{
/*.......*/
}
7、摘要式认证
是一个http认证的方法,它通过不需要通过网络传递明文密码的方法对基本认证改进
用户名:例如 user
领域:例如:administartive area
用户名: 领域和密码的md5 hash用冒号隔开
someuser:some realm:fdel7b91c3a510ecbdf39ru9df
规范specifics
zend_auth_adapter_digest需要若干输入参数:
文件名
领域
用户名
密码
身份(identity)
require_once zend/auth/adapter/digest.php
$adapter=new zend_auth_adapter_digest($filename,$realm,$username,$password);
$result=$adapter->authenticate();
$identity=$result->getIdentty();
print-r($identity);
8、http认证适配器
zend_auth_adapter_http提供了一个大部分符合rfc-2617的基本和数组http认证。数字认证是一个认证的方法,它再基本认证的基础上做了改进,不需要再网络上传输明文密码。
创建resolver
$path='files/passwd.txt';
$resolver=new zend-auth-adapter_http_reslover_file($path);
$path='files/passwd.txt';
$resolver=new zend_auth-adapter-http_resolver_file();
$resolver->setfile($path);
$config=array(
accept_schemes=>basic digest
realm=mywebsite
noce_timeout=3600
)
创建zend-auth_adapter-http对象
require_once zend/auth/adapter/http.php
$adapter=new zend_auth_adapter_http($config);
$require_once zend;auth/adapter/http/resovler/fiel.php
$basicresolver=new zend-auth-adapter_http_resolver_file();
$basicResolver->setfile(files/basicpasswd.txt)
$digestresolver=new zend_auth_adapter-http_resolver_file();
$digestresolver_setfile(files/digestpasswd.txt)
$adapter->setbaseicresolver($basicresolver);
$adapter->setdigestresolver($digestresolver);
最后完成认证,适配器对请求request or response都需要一个reference
assert($request instanceof zend_controller-request-http);
assert($response instanceof zend_controller_response-http);
$adapter->setresquest($request)
$adapter->setresponse($response)
$result=$adapter-.authenticate();
if(!$result->isvalid()){
//bad username/password,or canceled password prompt
}
转载自:http://blog.sina.com.cn/s/blog_4e72829b01000b97.html