2013-03-08 40 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

相关问题