Zend身份验证,其中用户角色存储在单独的db表中


Zend Authentication where user role stored in separate db table

我有一个用户表,其中userID,用户名和密码存储和一个角色表,其中包含用户角色。为了链接这两个表,我有一个包含userID和roleID的表(user_role)。如何使用Zend Auth对用户进行身份验证,使用Zend Acl控制用户访问。这是数据库的设计

您可以创建一个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;
    }
}

您还可以扩展任何当前适配器以提供所需的功能。

祝你好运!