2009-12-09 12 views
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) में एक अतिरिक्त स्तंभ जाँच करना चाहते हैं। मुझे नहीं पता कि यह एडाप्टर के साथ किया जा सकता है या नहीं। यह कैसे किया जा सकता है?

उत्तर

0

शामिल एथ एडैप्टर Zend_Auth_Adapter_DbTable आपको अतिरिक्त कॉलम की जांच करने की अनुमति नहीं देता है। आप Zend_Auth_Adapter_DbTable वर्ग का विस्तार कर सकते हैं और एक और कॉलम जोड़ सकते हैं। आपको नए फ़ील्ड $ _otherFieldValue और सार्वजनिक फ़ंक्शन सेट मेम्बरफ़िल्ल्ड ($ मान) के मान के लिए सदस्य चर जोड़ना होगा। अंत में, आपको ओवरराइड करना होगा:

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

जब के सत्यापन, एसक्यूएल इस तरह लग रही समाप्त होता है:

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

मैं वास्तव में यह नहीं समझता ... क्या आप कृपया अपने उत्तर पर विस्तार कर सकते हैं? विशेष रूप से पैराम के क्रम पर और यह कैसे काम करता है। – Andrew

+0

यह किसी अन्य कॉलम की जांच नहीं करता है लेकिन इसे पासवर्ड से जोड़ता है और उस पर हैश करता है .. मुझे लगता है कि वर्तमान में कोई अतिरिक्त फ़ील्ड जैसे वैध = 1 या कुछ की जांच करने का कोई तरीका नहीं है :( – Chris

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

ज़ेंड 3 क्लास 'Zend_Auth_Adapter_DbTable में 'को 'ज़ेंड \ प्रमाणीकरण \ एडाप्टर \ DbTable \ CredentialTreatmentAdapter' में बदल दिया गया है। क्लास' डीबीटेबल 'जहां तक ​​मैं देख सकता हूं उसे बहिष्कृत किया गया है। – ptyskju

0

मैं इस सवाल पहले से ही हल किया जा सकता है पता है, लेकिन आप वर्ग को विस्तारित करने के बिना इसे हल भी कर सकते हैं, getDbSelect() विधि का उपयोग करें और इसमें कहां क्लॉज जोड़ें:

$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');