2

認証中に追加の列を確認する必要があるシナリオがあります。これは、アプリケーションが一部のユーザー名をデータベースに保存し、一部を LDAP に保存するためです。認証の優先順位は、データベース内のユーザー名です。ユーザー名がデータベースに存在する場合、LDAP でチェックしません。それ以外の場合は、LDAP でチェックします。

LDAP ユーザーの場合、パスワード列が空白の同じ「ユーザー」テーブルにユーザー名のコピーを保持しています。ユーザーの両方のグループをうんざりさせるために、「LDAP および INTERNAL」という値を持つ userDirectory という追加の列があります。アプリケーション固有の設定とすべてのために、LDAP ユーザー名のコピーを保持する必要があります。

また、username+userDirectory は uniqueKey です

今私の問題は、同じユーザー名を持つが異なるuserDirectoryに複数のユーザーがいる場合があることです。前述のように、LDAP ユーザーはパスワードをデータベースに保存せず、その認証は別のコード スニペットです。

DB認証に以下のコードを使用しています。条件 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

例による高度な使用法の下の最後のコードを確認してください。コードは次のとおりです。

    $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 に答える