2009-12-09 15 views
5

Obecnie dostaję regularne DbTable Auth Adapter:Zend Framework: Jak sprawdzić dodatkową kolumnę podczas używania adaptera DbTable Auth?

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

Ale chcę sprawdzić dodatkową kolumnę w bazie danych (IsActive na przykład). Nie wiem, czy można to zrobić za pomocą adaptera. Jak to zrobić?

Odpowiedz

0

Dołączony Auth Adapater Zend_Auth_Adapter_DbTable nie pozwala na sprawdzenie dodatkowej kolumny. Możesz rozszerzyć klasę Zend_Auth_Adapter_DbTable i dodać kolejną kolumnę. Będziesz musiał dodać zmienną składową dla wartości nowego pola $ _otherFieldValue i publicznego zestawu funkcji setMemberField (wartość $). Na koniec trzeba będzie przesłonić:

protected function _authenticateCreateSelect() 

Nadzieję, że pomaga.

1

używam dwie kolumny dla mojego Zend_Auth_Adapter_DbTable, a wygląda to tak:

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

Po uwierzytelnieniu, SQL kończy się wyglądać jak ten:

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

Tak, że sprawdza dodatkową kolumnę , password_salt, a dla mnie działa dobrze. Nie wiem, czy to ci pomoże, ponieważ nie wiem, co próbujesz zrobić.

+0

Naprawdę nie rozumiem tego ... Czy możesz rozwinąć swoją odpowiedź? W szczególności w kolejności params i jak to działa. – Andrew

+0

Nie sprawdza innej kolumny, ale łączy ją z hasłem i wykonuje skrót na tym .. Myślę, że obecnie nie ma możliwości sprawdzenia dodatkowego pola, takiego jak valid = 1 lub coś takiego :( – Chris

2

Mam podobną sytuację, i przedłużyła Zend_Auth_Adapter_DbTable do zaspokojenia moich potrzeb:

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

I następnie używać go tak:

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

W klasie Zend 3 "Zend_Auth_Adapter_DbTable 'jest zmienione na' Zend \ Authentication \ Adapter \ DbTable \ CredentialTreatmentAdapter'. Klasa 'DbTable', o ile widzę, jest przestarzała. – ptyskju

0

wiem, to pytanie może być już rozwiązany, ale możesz również rozwiązać ten problem bez potrzeby rozszerzania klasy, użyj metody getDbSelect() i dodaj klauzulę 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'); 
Powiązane problemy