0

userID、ユーザー名、パスワードが格納される User テーブルと、 user role を含む Role テーブルがあります。これら 2 つのテーブルをリンクするために、userID と roleID を含むテーブル (user_role) があります。Zend Auth を使用してユーザーを認証し、Zend Acl を使用してユーザー アクセスを制御するにはどうすればよいですか。 これがデータベースの設計です

4

1 に答える 1

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;
    }
}

現在のアダプタを拡張して、必要な機能を提供することもできます。

幸運を!

于 2013-03-09T06:31:34.280 に答える