我有一个场景,我需要在进行身份验证时检查一些其他列。这是因为,应用程序将一些用户名存储在数据库中,一些用户名存储在LDAP中。身份验证优先级适用于数据库中的用户名。如果数据库中存在用户名,我们将不会检入LDAP,否则我们将在LDAP中进行检查。
对于LDAP用户,我们会在同一个“用户”表中保留一个用户名的副本,其中包含空白密码列。为了令两组用户感到厌恶,还有一个名为userDirectory的列,其值为“LDAP和INTERNAL”。我们必须为应用程序特定设置和所有设置保留LDAP用户名的副本。
用户名+ userDirectory也是uniqueKey
现在我的问题是,有时会有多个用户具有相同的用户名但在不同的userDirectory中。如上所述,LDAP用户将没有密码存储在数据库中,并且该身份验证是一个单独的代码段。
我使用以下代码进行数据库身份验证。即使我添加条件setCredentialTreatment('md5(?)AND userDirectory =“internal”'),它也在搜索LDAP用户。我如何限制userDirectory ='internal'
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password')
->setCredentialTreatment('md5(?) AND userDirectory="internal"');
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
答案 0 :(得分:6)
我已更改您的代码:
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
$authAdapter->setTableName('users')
->setIdentityColumn('username')
->setCredentialColumn('password')
->setCredentialTreatment('MD5(?)'); // changed
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
$authAdapter->getDbSelect()->where('userDirectory = "internal"'); // added
答案 1 :(得分:1)
http://framework.zend.com/manual/1.12/en/zend.auth.adapter.dbtable.html
检查高级用法示例下的最后一个代码,代码如下
$registry = Zend_Registry::getInstance();
$DB = $registry['DB'];
$authAdapter = new Zend_Auth_Adapter_DbTable($DB,'usertable','username','password');
$authAdapter->setIdentity($request->getParam('username'));
$authAdapter->setCredential($request->getParam('password'));
$select = $authAdapter->getDbSelect();
$select->where('`active` = 1');
$result = $authAdapter->authenticate();
if($result->isValid()){
//set user proper to zend instance
$this->_redirect('/index');
}
else
{
//logout or redirect to same page
}
答案 2 :(得分:0)
扩展Zend_Auth_Adapter_DbTable
并覆盖_authenticateCreateSelect()
这样的方法
protected function _authenticateCreateSelect()
{
$select = parent::_authenticateCreateSelect();
return $select->where('userDirectory = ?','internal');
}