あなたが与えた例は、データベースに保存されているソルトを使用しています。'salt'というフィールドの各行にsaltが格納されている限り機能します。ソルトがDBとPHP変数になかった場合、コードは次のようになります。
->setCredentialTreatment("SHA1(CONCAT(?, '$salt'))")
SHA512の使用に関しては、これは少し注意が必要かもしれません。MySQLを使用していると仮定すると、この場合のSHA1()はMySQL関数であり、MySQLにはSHA512の関数がありません。また、PHPもありません(編集:後者については間違っていました。コメントを参照してください)。 )。したがって、独自のPHP SHA512関数を実装し、最初にDBからユーザーのソルトをロードし、結果をハッシュし、setCredentialTreatmentの変数には何もしない必要があります。
他の回答が示唆しているように、このために独自のZend_Auth_Adapterを作成することをお勧めします。認証アダプタは、おそらくZend_Auth_Adapter_DbTableを使用している時点で認証を処理するクラスです。マニュアルで認証アダプタに関する詳細情報を見つけることができます:http://framework.zend.com/manual/en/zend.auth.introduction.html
次に例を示します。
class My_Auth_Adapter extends Zend_Auth_Adapter_DbTable
{
public function authenticate()
{
// load salt for the given identity
$salt = $this->_zendDb->fetchOne("SELECT salt FROM {$this->_tableName} WHERE {$this->_identityColumn} = ?", $this->_identity);
if (!$salt) {
// return 'identity not found' error
return new Zend_Auth_Result(Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND, $this->_identity);
}
// create the hash using the password and salt
$hash = ''; // SET THE PASSWORD HASH HERE USING $this->_credential and $salt
// replace credential with new hash
$this->_credential = $hash;
// Zend_Auth_Adapter_DbTable can do the rest now
return parent::authenticate();
}
}