Zend framework 不同表中的标识和凭据。如何登录用户?
我正在使用Zend框架 我将用户信息保存在两个表中。 我有一张表,上面有他的基本信息和密码,另一张表里有他的电子邮件。 他可以用任何电子邮件登录 我的问题是我应该如何扩展Zend_Auth_Adapter_DbTable以便允许这样做 我不喜欢使用表视图 [编辑] 我找到了解决办法。对我有用的是:Zend framework 不同表中的标识和凭据。如何登录用户?,zend-framework,authentication,zend-db,Zend Framework,Authentication,Zend Db,我正在使用Zend框架 我将用户信息保存在两个表中。 我有一张表,上面有他的基本信息和密码,另一张表里有他的电子邮件。 他可以用任何电子邮件登录 我的问题是我应该如何扩展Zend_Auth_Adapter_DbTable以便允许这样做 我不喜欢使用表视图 [编辑] 我找到了解决办法。对我有用的是: class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable { protected function _authenticateCr
class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable
{
protected function _authenticateCreateSelect()
{
// build credential expression
if (empty($this->_credentialTreatment) || (strpos($this->_credentialTreatment, '?') === false)) {
$this->_credentialTreatment = '?';
}
$credentialExpression = new Zend_Db_Expr(
'(CASE WHEN ' .
$this->_zendDb->quoteInto(
$this->_zendDb->quoteIdentifier($this->_credentialColumn, true)
. ' = ' . $this->_credentialTreatment, $this->_credential
)
. ' THEN 1 ELSE 0 END) AS '
. $this->_zendDb->quoteIdentifier(
$this->_zendDb->foldCase('zend_auth_credential_match')
)
);
// get select
//$dbSelect = clone $this->getDbSelect();
$mdl = new My_Model_Db_Table_Users();
$dbSelect = $mdl->select();
$dbSelect = $dbSelect->setIntegrityCheck(false);
$dbSelect = $dbSelect->from(array('u' => $this->_tableName), array('*', $credentialExpression));
$dbSelect = $dbSelect->joinInner(array('ue' => 'users_emails'), 'ue.id_user = u.user_id', array('user_email'));
$dbSelect = $dbSelect->where('ue.' . $this->_zendDb->quoteIdentifier($this->_identityColumn, true) . ' = ?', $this->_identity);
return $dbSelect;
}
}
有一个名为
Zend\u Auth\u Adapter\u DbTable::getDbSelect
的方法返回Zend\u Db\u Select
对象。
调用它,然后可以将这两个表连接起来
希望这有帮助
问候,,
Ahmed B.我在问题中解释了它为我做了什么
但是,重复一下,对我来说最简单的方法是更改
Zend\u Auth\u Adapter\u DbTable::\u authenticateCreateSelect()
这里有一个替代方法
扩展Zend_Auth_Adapter_DbTable类
class My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable {
public function setDbSelect($select) {
$this->_dbSelect = $select;
return $this;
}
}
创建新适配器的实例
$authAdapter = new My_Auth_Adapter_DbTable(
$this->dbTable->getAdapter()
, 'Users'
, 'Users.username'
, 'Users.password'
);
在应用程序_Model _DbTable _Users类中,创建一个方法,返回包含联接表的select对象
public function getSelectAuth() {
$select = $this
->select()
->setIntegrityCheck(false)
->from(array('SystemPeopleJoined' => $this->_name)
, array(
'id'
, 'person_id'
, 'system_role_id'
, 'created_on'
, 'expires_on'
)
)
->joinInner(
'People'
, 'People.id = SystemPeopleJoined.person_id'
, array(
'first_name' => 'first_name'
, 'last_name' => 'last_name'
, 'name' => "CONCAT_WS(' ', `People`.`first_name`, `People`.`last_name`)"
)
return $select;
}
在适配器中设置选择对象
$select = $this->dbTable->getSelectAuth();
$authAdapter
->setDbSelect($select)
->setIdentity($params['username'])
->setCredential($params['password'])
->setCredentialTreatment("SHA1(?)")
;
非常感谢你的回答。我已经找到了解决方案,我更改了_authenticateCreateSelect(),它对我有效。