详解Zend_Auth组件的使用
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()方法
非直接使用适配器的例子:
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 }