在Zend身份验证中,如何检查其他列以及身份验证?

时间:2012-09-20 11:07:05

标签: zend-framework zend-auth

我有一个场景,我需要在进行身份验证时检查一些其他列。这是因为,应用程序将一些用户名存储在数据库中,一些用户名存储在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);

3 个答案:

答案 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');
    }