2012-09-20 37 views
2

我有一個場景,我需要檢查一些額外的列,而進行身份驗證。這是因爲,應用程序在數據庫中存儲了一些用戶名,而在LDAP中存儲了一些。身份驗證優先級用於數據庫中的用戶名。如果數據庫中存在用戶名,我們將不檢查LDAP,否則我們將在LDAP中檢查它。在Zend身份驗證中,我如何檢查附加列以及身份驗證?

對於LDAP用戶,我們將同一個「用戶」表中的用戶名保留一份空白密碼列。爲了惡化這兩組用戶,還有一個名爲userDirectory的列,其值爲「LDAP和INTERNAL」。我們必須爲特定於應用程序的設置和全部保留LDAP用戶名的副本。

而且用戶名+ userDirectory是唯一鍵

現在我的問題是,有時會有多個用戶使用同一個用戶名,但在不同的userDirectory。如上所述,LDAP用戶不會在數據庫中存儲密碼,並且身份驗證是一個單獨的代碼片段。

我正在使用下面的代碼進行數據庫身份驗證。即使我正在添加條件setCredentialTreatment('md5(?)AND userDirectory =「internal」'),它也正在搜索LDAP用戶。如何限制這對於userDirectory = '內部'

$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); 

回答

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 
+0

這對我很有用,我不需要更改我的代碼。非常感謝您的時間和答覆。 – codlib

0

擴展Zend_Auth_Adapter_DbTable和覆蓋_authenticateCreateSelect()方法這樣

protected function _authenticateCreateSelect() 
    { 
     $select = parent::_authenticateCreateSelect(); 
     return $select->where('userDirectory = ?','internal'); 
    } 
+0

非常感謝。不幸的是,我對zend很陌生,不知道該怎麼做。你能告訴我我需要做什麼嗎? – codlib

1

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

檢查Advanced Usage By下的最後一個代碼例如,代碼如下

$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 
    }