zoukankan      html  css  js  c++  java
  • 详解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
    }

    转载自:http://blog.sina.com.cn/s/blog_4e72829b01000b97.html

  • 相关阅读:
    数组越界的现象
    找出数组中的最大值
    Django Form和ModelForm组件
    AJAX
    Mysql数据库概述
    Django中的session和cookie及分页设置
    Django-admin组件使用
    Django中间件
    MySQL视图、触发器、事务、存储过程、函数
    机器学习基础算法__python实现(基于numpy等基础库)
  • 原文地址:https://www.cnblogs.com/hongfei/p/2687224.html
Copyright © 2011-2022 走看看