2013-07-03 1 views
1

До сих пор я сохранил все пароли в виде простого текста, потому что сайт не в сети, и я решил дождаться нового password api.Как использовать php 5.5 password api с Zend_Auth_Adapter_DbTable

У меня есть этот код работает для паролей в виде обычного текста:

<?php 
$dbAdapter = Zend_Db_Table::getDefaultAdapter(); 
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); 

$authAdapter->setTableName('account') 
    ->setIdentityColumn('account_id') 
    ->setCredentialColumn('account_password'); 

// Get our authentication adapter and check credentials 
$adapter = $authAdapter; 
$adapter->setIdentity($values['account_id']); 
$adapter->setCredential($values['password']); 

$auth = Zend_Auth::getInstance(); 
$result = $auth->authenticate($adapter); 
if ($result->isValid()) { 
    $user = $adapter->getResultRowObject(); 
    $auth->getStorage()->write($user); 
    return true; 
} 
return false; 

Согласно docs я должен реализовать свой собственный адаптер и, возможно, просто изменить, чтобы использовать password_verify().

Мне не хватает большой картины здесь, как все работает вместе.

Мой вопрос:

  1. объект Witch я должен изменить? $authAdaper или $auth

Любой высокий уровень (или низкий уровень: D), пример кода будут оценены.

Все лучшее Адам

ответ

1

Если вы хотите изменить способ, в котором аутентификация работает путем добавления password_hash шифрования, то вам нужно будет сделать это в течение PHP.

Как вы все еще хотите использовать аутентификацию базы данных, я думаю, что воссоздание этого как нового адаптера было бы излишним. Вы могли однако, расширить текущий адаптер базы данных, такие как:

class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable 
{ 
    public function setCredential($credential) 
    { 
    $this->_credential = password_hash($credential); 
    return $this; 
    } 
} 

Это означает, что любой пароль, предоставленный к адаптеру всегда будет зашифрован с помощью функции password_hash.

Это может быть выполнено за пределами адаптера путем хеширования пароля до вызова setCredential.

$options = array('salt' => $config->passwordSalt); 
$hashPassword = password_hash($plainTextPassword, PASSWORD_BCRYPT, $options); 
$adpater->setCredential($hashPassword); 

Этот метод позволит вам изменить необязательные параметры перед тем, как перейти к адаптеру.

Наконец, стоит упомянуть, что метод setCredentialTreatment обычно используется для предоставления шифрования пароля, которое выполняется в операторе SQL (это означает, что вам нужно будет использовать команды MySQL, а не password_hash).

$authAdapter->setTableName('user') 
     ->setIdentityColumn('email') 
     ->setCredentialColumn('password') 
     ->setCredentialTreatment(sprintf("MD5(CONCAT(?,'%s'))", $config->passwordSalt)); 
+0

$ adpater-> setCredential ($ hashPassword); таким образом мне нужно хранить соль отдельно в db? – adamnyberg

+0

Мне не нужно использовать password_verify() где угодно? – adamnyberg

+0

Если вы хотите использовать одну соль для всех паролей, вы можете определить ее в своем 'application.ini'. '$ config-> passwordSalt' - это просто строка,' $ config' является экземпляром 'Zend_Config'. – AlexP

Смежные вопросы