1

Zend フレームワークを使用しています。

ユーザー情報を 2 つのテーブルに保存します。彼の基本情報とパスワード用のテーブルが 1 つあります。もう 1 つのテーブルには、彼の電子メールを保存します。彼はどの電子メールでもログインできます。

私の質問は、これを許可できるように Zend_Auth_Adapter_DbTable をどのように拡張すればよいですか?

テーブルビューを使用しないことを好みます。

[編集]

解決策を見つけました。私のために働いたもの:

class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable
{
protected function _authenticateCreateSelect()
{
    // build credential expression
    if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, '?') === false)) {
        $this->_credentialTreatment = '?';
    }

    $credentialExpression = new Zend_Db_Expr(
        '(CASE WHEN ' .
        $this->_zendDb->quoteInto(
            $this->_zendDb->quoteIdentifier($this->_credentialColumn, true)
            . ' = ' . $this->_credentialTreatment, $this->_credential
            )
        . ' THEN 1 ELSE 0 END) AS '
        . $this->_zendDb->quoteIdentifier(
            $this->_zendDb->foldCase('zend_auth_credential_match')
            )
        );

    // get select


   //$dbSelect = clone $this->getDbSelect();
   $mdl = new My_Model_Db_Table_Users();
   $dbSelect = $mdl->select();
   $dbSelect = $dbSelect->setIntegrityCheck(false);
   $dbSelect = $dbSelect->from(array('u' => $this->_tableName), array('*', $credentialExpression));
   $dbSelect = $dbSelect->joinInner(array('ue' => 'users_emails'), 'ue.id_user = u.user_id', array('user_email'));
   $dbSelect = $dbSelect->where('ue.' .  $this->_zendDb->quoteIdentifier($this->_identityColumn, true) . ' = ?', $this->_identity);

   return $dbSelect;
}
}
4

3 に答える 3

1

私は質問の中でそれが私のために何をしたのかを説明しました。

しかし、繰り返しになりますが、私にとって最も簡単なのは変更することでしたZend_Auth_Adapter_DbTable::_authenticateCreateSelect()

于 2012-07-06T07:18:07.163 に答える
1

Zend_Auth_Adapter_DbTable::getDbSelectリターンZend_Db_Selectオブジェクトというメソッドがあります。それを呼び出すと、これら 2 つのテーブルを結合できます。

この助けを願っています。

よろしく、Ahmed B.

于 2012-07-05T15:39:35.017 に答える
0

別の方法を次に示します。

Zend_Auth_Adapter_DbTable クラスを拡張します。

class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable {
    public function setDbSelect($select) {
        $this->_dbSelect = $select;
        return $this;
    }
}

新しいアダプターのインスタンスを作成します

$authAdapter = new My_Auth_Adapter_DbTable(
    $this->dbTable->getAdapter()
    , 'Users'
    , 'Users.username'
    , 'Users.password'
);

Application_Model_DbTable_Users クラスで、結合されたテーブルを含む選択オブジェクトを返すメソッドを作成します。

public function getSelectAuth() {
    $select = $this
        ->select()
    ->setIntegrityCheck(false)
    ->from(array('SystemPeopleJoined' => $this->_name)
        , array(
            'id'
            , 'person_id'
            , 'system_role_id'
            , 'created_on'
            , 'expires_on'
        )
    )
    ->joinInner(
        'People'
        , 'People.id = SystemPeopleJoined.person_id'
        , array(
            'first_name' => 'first_name'
            , 'last_name' => 'last_name'
            , 'name' => "CONCAT_WS(' ', `People`.`first_name`, `People`.`last_name`)"
    )
    return $select;
}

アダプターで選択オブジェクトを設定します

$select = $this->dbTable->getSelectAuth();

$authAdapter
    ->setDbSelect($select)
    ->setIdentity($params['username'])
    ->setCredential($params['password'])
    ->setCredentialTreatment("SHA1(?)")
;
于 2013-08-19T17:06:36.270 に答える