2

我有一个场景,我需要在进行身份验证时检查一些额外的列。这是因为,应用程序将一些用户名存储在数据库中,而一些用户名存储在 LDAP 中。身份验证优先级适用于数据库中的用户名。如果数据库中存在用户名,我们将不会在 LDAP 中检查,否则我们将在 LDAP 中检查。

对于 LDAP 用户,我们将用户名的副本保存在同一个“用户”表中,并带有空白密码列。为了让这两组用户都感到恶心,还有一个名为 userDirectory 的附加列,其值为“LDAP 和 INTERNAL”。我们必须保留一份 LDAP 用户名的副本,以用于应用程序特定的设置和所有内容。

username+userDirectory 也是一个 uniqueKey

现在我的问题是,有时会有多个用户具有相同的用户名但在不同的用户目录中。如上所述,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);
4

3 回答 3

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
于 2012-09-20T13:20:42.383 回答
1

http://framework.zend.com/manual/1.12/en/zend.auth.adapter.dbtable.html

查看Advanced Usage By Example下的最后一个代码,代码如下

    $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
    }
于 2013-04-04T13:10:42.943 回答
0

像这样扩展Zend_Auth_Adapter_DbTable和覆盖_authenticateCreateSelect()方法

protected function _authenticateCreateSelect()
    {
        $select = parent::_authenticateCreateSelect();
        return $select->where('userDirectory = ?','internal');
    }
于 2012-09-20T11:23:04.397 回答