2009-12-09 48 views
5

目前,我得到一个普通DbTable Auth AdapterZend Framework:如何在使用DbTable验证适配器时检查附加列?

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例如)来检查的附加列。我不知道这是否可以用适配器来完成。如何才能做到这一点?

回答

0

包含的Auth Adapater Zend_Auth_Adapter_DbTable不允许您检查其他列。您可以扩展Zend_Auth_Adapter_DbTable类并添加另一列。您必须为新字段$ _otherFieldValue的值和公共函数setMemberField($ value)添加一个成员变量。最后,你必须覆盖:

protected function _authenticateCreateSelect() 

希望有帮助。

1

我用两列我Zend_Auth_Adapter_DbTable,它看起来像这样:

$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,对我来说效果很好。我不知道这是否对你有帮助,因为我不知道你在做什么。

+0

我真的不明白这一点......你可以请你的答案扩展吗?具体来说就是params的顺序以及它是如何工作的。 – Andrew 2009-12-15 05:03:08

+0

它不检查另一列,但它与密码相结合,并做了一个哈希.. 我认为目前没有办法检查额外的字段,如有效= 1或什么:( – Chris 2010-11-18 11:01:12

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

在Zend 3类'Zend_Auth_Adapter_DbTable '更改为'Zend \ Authentication \ Adapter \ DbTable \ CredentialTreatmentAdapter'。我可以看到的类'DbTable'已被弃用。 – ptyskju 2018-03-05 14:13:33

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'); 
相关问题