5

現在、私は定期的に取得していDbTable Auth Adapterます:

protected function _getAuthAdapter($formData)
{       
    $dbAdapter = Zend_Db_Table::getDefaultAdapter();
    $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
    $authAdapter->setTableName('users')
        ->setIdentityColumn('username')
        ->setCredentialColumn('password');
    $authAdapter->setIdentity($formData['username']);
    $authAdapter->setCredential(md5($formData['password']));
    return $authAdapter;
}

しかし、データベース内の追加の列を確認したい (IsActiveたとえば)。これがアダプターでできるかどうかはわかりません。これはどのように行うことができますか?

4

4 に答える 4

2

私も同様の状況にありZend_Auth_Adapter_DbTable、ニーズを満たすために を拡張しました。

class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable
{
    protected $_customerIdColumn = 'customer_id';
    protected $_customerId = false;

    public function setCustomerId($id) {
        $this->_customerId = $id;
        return $this;
    }

    public function getCustomerId() {
        return ($this->_customerId !== false) ? $this->_customerId : '';
    }

    public function _authenticateCreateSelect() {
        $dbSelect = parent::_authenticateCreateSelect();
        $dbSelect->where($this->_zendDb->quoteIdentifier($this->_customerIdColumn, true) . ' = ?',
            $this->getCustomerId());
        return $dbSelect;
    }
}

次に、次のように使用します。

public function getAuthAdapter(array $params)
{
    $authAdapter = new My_Auth_Adapter_DbTable(
        $params['db_adapter'],
        'users',
        'username',
        'password',
        '? AND active = 1'
    );

    $authAdapter->setIdentity($params['username'])
        ->setCustomerId($params['customer_id'])
        ->setCredential($params['password']);

    return $authAdapter;
}
于 2010-11-30T21:20:07.740 に答える
1

Zend_Auth_Adapter_DbTable に 2 つの列を使用すると、次のようになります。

$authAdapter = new Zend_Auth_Adapter_DbTable(
  Zend_Registry::get('database'),
  "user",
  "username",
  "password_hash", // column 1
  "MD5( CONCAT(?,password_salt) )" // column 2
);

認証時、SQL は次のようになります。

SELECT `user`.*, 
(CASE WHEN `password_hash` = MD5( CONCAT('password entered',password_salt) )
  THEN 1 ELSE 0 END) AS `zend_auth_credential_match`
FROM `user` WHERE (`username` = 'username entered')

したがって、それは追加の列をチェックしますpassword_salt、そして私にとってはうまくいきます。あなたが何をしようとしているのかわからないので、それがあなたを助けるかどうかはわかりません。

于 2009-12-09T02:49:20.013 に答える
0

含まれている認証アダプター Zend_Auth_Adapter_DbTable では、追加の列を確認することはできません。Zend_Auth_Adapter_DbTable クラスを拡張して、別の列を追加できます。新しいフィールド $_otherFieldValue の値とパブリック関数 setMemberField($value) のメンバー変数を追加する必要があります。最後に、オーバーライドする必要があります。

protected function _authenticateCreateSelect()

それが役立つことを願っています。

于 2009-12-09T02:29:38.213 に答える
0

この質問はすでに解決されている可能性がありますが、クラスを拡張する必要なくこれを解決することもできます。 getDbSelect() メソッドを使用して where 句を追加します。

    $authAdapter = new Zend_Auth_Adapter_DbTable(Model_Users::getDefaultAdapter());

    $authAdapter->setTableName('users');
    $authAdapter->setIdentityColumn('email');
    $authAdapter->setCredentialColumn('password')->setCredentialTreatment('md5(?)');
    $authAdapter->setIdentity($email);
    $authAdapter->setCredential($password);
    $authAdapter->getDbSelect()->where('active = 1');
于 2015-02-03T12:19:41.607 に答える