2015-11-24 105 views
1

所以我驗證用戶名,密碼和組成員在Active Directory中,像這樣:Active Directory的驗證是緩慢PHP

function validate($username, $password, $groupname = null) { 
    if ($username && $password) { 
    $link = ldap_connect($domain); 
    if ($link) { 
     ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3); 
     $bind = ldap_bind($link, $username, $password); 
     if ($bind) { 
     if ($groupname) { 
      $filter = "(samAccountName=".$username.")"; 
      $attrs = array("memberOf"); 
      $res  = ldap_search($link, $baseDN, $filter, $attrs); 
      $entries = ldap_get_entries($link, $res); 
      $isMember = false; 
      if ($entries && $entries[0] && $entries[0]['memberof']) { 
      $arr = $entries[0]['memberof']; 
      foreach ($arr as $key => $value) { 
       if ($key != 'count') { 
       $isMember = $isMember || preg_match("|".preg_quote($groupname)."|", $value); 
       } 
      } 
      } 
      return $isMember; 
     } else { 
      return true; 
     } 
     } else { 
     return false; 
     } 
    } else { 
     error_log("Could not connect to Active Directory"); 
     return false; 
    } 
    } else { 
    error_log("Username or password missing"); 
    return false; 
    } 
} 

這正常工作,但痛苦緩慢,需要儘可能2〜3分鐘來驗證用戶是否屬於一個組。如果我省略組成員身份檢查,它幾乎會立即運行。我如何加速(沒有緩存)?

EDIT

因爲它不是從提問清楚,瓶頸是ldap_search函數,它接受〜127秒,該程序的其餘部分在不到一秒鐘的運行。還應該補充一點,我們只有大約20個AD用戶和10個組。

+0

當你傳遞一個空'''$ attrs'''來'''ldap_search'''是否會持續多長時間? – heiglandreas

+0

結果完全相同。 –

+0

什麼是您的基地DN?我是對的,LDAP有一個相當大的分佈式目錄樹? – heiglandreas

回答

1

首先,它看起來像foreach -loop與preg_match裏面需要一些時間。特別是如果有很多團隊要檢查。

但後來很明顯,當時只有10組,並在公元20用戶,所以它必須是不同的東西。

到底是缺少超時問題。在ldap_search()之前加上ldap_set_option($connection, LDAP_OPT_NETWORK_TIMEOUT, 10);解決了問題。

這看起來好像在那個特殊情況下的LDAP服務器連接已打開,但直到超時被擊中的LDAP服務器沒有響應正確,因此,客戶在等待一個答案。將此超時設置爲比默認值(不確定)更小的值時,會導致ldap_search更早返回,因爲它不再需要等待。

AFAIK這已被固定在PHP-5.6.14和php-7.0.0

+0

不,PHP代碼可能比你慢,但仍然幾乎是瞬間運行。簡單地使用'preg_match'而不是'strpos'不會使運行時間增加10個數量級。問題在於獲取AD的結果。我只是不知道是否有比ldap_search' /'ldap_get_entries'更好的模式來完成此操作。 –

+0

那麼瓶頸在哪裏呢? ''ldap_search'''和'''ldap_get_entries''花費多少時間?無論您是設置'''attrs = ['memberof']'''還是'''attrs = []'''? – heiglandreas

+0

已更新的問題。 –