2013-01-23 102 views
6

我正在開發一個使用ZF2的應用程序。我使用用戶名&密碼完成了用戶身份驗證。但是,我想在驗證中檢查一個額外的列(例如:狀態)。ZF2身份驗證

我已經完成了以下代碼。

public function authenticate() 
{  
    $this->authAdapter = new AuthAdapter($this->dbAdapter, 
      'usertable', 
      'username', 
      'password' 
    ); 

    $this->authAdapter->setIdentity($this->username) 
       ->setCredential($this->password) 
       ->setCredentialTreatment('MD5(?)'); 
    $result = $this->authAdapter->authenticate(); 
    return $result; 
} 

如何在身份驗證中檢查列狀態? 注意:狀態值應該是1. 謝謝。

回答

7

當我使用zf2和doctrine構建身份驗證時,我創建了授權插件並自定義了this adapter以傳遞額外的列進行身份驗證。 你可能需要走相似的方向。改變

$adapter = new AuthAdapter($db, 
          'users', 
          'username', 
          'password', 
          'MD5(?)' 
          ); 

// get select object (by reference) 
$select = $adapter->getDbSelect(); 
$select->where('active = "TRUE"'); 

// authenticate, this ensures that users.active = TRUE 
$adapter->authenticate(); 

Reference

後您的代碼應該是這個樣子。

public function authenticate() 
{  
    $this->authAdapter = new AuthAdapter($this->dbAdapter, 
      'usertable', 
      'username', 
      'password' 
    ); 

    $select = $this->authAdapter->getDbSelect(); 
    $select->where('status= "1"'); 
    $this->authAdapter->setIdentity($this->username) 
       ->setCredential($this->password) 
       ->setCredentialTreatment('MD5(?)'); 
    $result = $this->authAdapter->authenticate(); 
    return $result; 
} 
+0

非常感謝你。這是工作。大!!!。 – user2003356

+0

@Developer你並沒有真正使用MD5作爲憑證處理,對嗎? –

+0

@丹尼爾我總是使用CredentialTreatment,但user2003356可能不會使用它,上面的答案是基於問題的回覆。 – Developer

1

ZF2提供另一種方式來處理使用其它列比預計用於身份和憑證得益於方法getResultRowObject的那些額外的檢查。在您的示例中,usertable的所有列都可用作由getResultRowObject()返回的對象的屬性。所以,你可以用這個擴展代碼:

if ($result->isValid()) { 
    $identityRowObject = $this->authAdapter->getResultRowObject(); 
    $status = $identityRowObject->status; 
    // do whatever complex checking you need with $status... 
} 

問候, 馬克