2013-03-08 41 views
0

用戶角色我有哪裏的用戶ID,用戶名和密碼存儲用戶表,其中包含用戶角色的角色表。要鏈接這兩個表,我有一個包含userID和roleID的表(user_role)。我如何使用Zend Auth來驗證用戶並使用Zend Acl來控制用戶訪問。 This is the database designZend的認證,其中存儲在單獨的數據庫表

+0

@TimFountain我在YouTube上關注zf_turoial。問題是Zend_Auth_Adapter_DbTable的時刻需要一個db表。此表需要有一個存儲用戶角色的列,但在我的數據庫中,用戶角色位於單獨的表中。 – arjang27 2013-03-08 20:03:00

回答

0

您可以創建一個Zend_Auth適配器,它適用於您的應用程序所具有的任何結構。

下面是一個Auth適配器的示例,它使用我的實體模型和映射器爲驗證提供憑據和用戶數據。

<?php 

/** 
* Description of Auth_Adapter 
* 
*/ 
class Auth_Adapter implements Zend_Auth_Adapter_Interface 
{ 
    /** 
    * The username 
    * 
    * @var string 
    */ 
    protected $identity = null; 
    /** 
    * The password 
    * 
    * @var string 
    */ 
    protected $credential = null; 
    /** 
    * Users database object 
    * 
    * @var Model_Mapper_Abstract 
    */ 
    protected $usersMapper = null; 

    /** 
    * @param string $username 
    * @param string $password 
    * @param Model_Mapper_Abstract $userMapper 
    */ 
    public function __construct($username, $password, Model_Mapper_Abstract $userMapper = null) 
    { 
     if (!is_null($userMapper)) { 
      $this->setMapper($userMapper); 
     } else { 
      $this->usersMapper = new Application_Model_Mapper_User(); 
     } 
     $this->setIdentity($username); 
     $this->setCredential($password); 
    } 

    /** 
    * @return \Zend_Auth_Result 
    */ 
    public function authenticate() 
    { 
     // Fetch user information according to username 
     $user = $this->getUserObject(); 

     if (is_null($user)) { 
      return new Zend_Auth_Result(
        Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, 
        $this->getIdentity(), 
        array('Invalid username') 
      ); 
     } 
     // check whether or not the hash matches using my own password class 
     $check = Password::comparePassword($this->getCredential(), $user->password); 
     if (!$check) { 
      return new Zend_Auth_Result(
        Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID, 
        $this->getIdentity(), 
        array('Incorrect password') 
      ); 
     } 
     // Success! 
     return new Zend_Auth_Result(
       Zend_Auth_Result::SUCCESS, 
       $this->getIdentity(), 
       array() 
     ); 
    } 

    /** 
    * @param type $userName 
    * @return \Auth_Adapter 
    */ 
    public function setIdentity($userName) 
    { 
     $this->identity = $userName; 
     return $this; 
    } 

    /** 
    * @param type $password 
    * @return \Auth_Adapter 
    */ 
    public function setCredential($password) 
    { 
     $this->credential = $password; 
     return $this; 
    } 

    /** 
    * @param type $mapper 
    * @return \Auth_Adapter 
    */ 
    public function setMapper($mapper) 
    { 
     $this->usersMapper = $mapper; 
     return $this; 
    } 

    /** 
    * @return object 
    */ 
    private function getUserObject() 
    { 
     return $this->getMapper()->findOneByColumn('name', $this->getIdentity()); 
    } 

    /** 
    * @return object 
    */ 
    public function getUser() 
    { 
     $object = $this->getUserObject(); 
     $array = array(
      'id' => $object->id, 
      'name' => $object->name, 
      'role' => $object->role 
     ); 
     return (object) $array; 
    } 

    /** 
    * @return string 
    */ 
    public function getIdentity() 
    { 
     return $this->identity; 
    } 

    /** 
    * @return string 
    */ 
    public function getCredential() 
    { 
     return $this->credential; 
    } 

    /** 
    * @return object Model_Mapper_Abstract 
    */ 
    public function getMapper() 
    { 
     return $this->usersMapper; 
    } 
} 

您還可以擴展任何當前適配器以提供所需的功能。

祝你好運!

+0

謝謝你的幫助@ RockyFord。 – arjang27 2013-03-11 23:46:03

相關問題