【问题标题】:ldap_search(): Search: Operations error againldap_search():搜索:再次出现操作错误
【发布时间】:2017-09-22 23:03:24
【问题描述】:

大家好,

我知道我的问题一定有似曾相识的一面,但我没有通过 stackoverflow 或其他方式找到任何解决方案。 所以我一直在尝试创建一个允许连接到 ldap 的函数,然后检查我的用户的 id 和 pwd,然后检查他所在的组。 当我在一个“部分”中完成此功能时,它起作用了。 但我想在三个不同的功能中做到这一点,这样我就可以一个一个地处理它。 所以现在我有了连接 ldap 的功能:

   function ldapConnection() {
    $ldapConnection = ldap_connect(LDAP_SERVER);
    ldap_set_option($ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapConnection, LDAP_OPT_REFERRALS, 0);
    return $ldapConnection;
}

它返回一个标识符 LDAP 链接,因此连接正常。

然后我有检查登录和密码的功能:

  public function checkLoginPwd($login, $pwd) {
    $ldapConnexion = $this->ldapConnection();
    if ($bind = ldap_bind($ldapConnexion, $login, $pwd)) {
        return true;
        //ldap_close($ldapConnexion);
    } else {
        return false;
    }
}

然后是我遇到问题的函数。

    public function checkUserRights($login, $pwd, $ldapConnection) {   
    //Récupération login
    $loginAccount = "(sAMAccountName=$login)";
    //Suppression de "myGroup\"
    $filter = str_replace("myGroup\\", "", $loginAccount);
    $attr = array("memberof");
    //Recherche
    $result = ldap_search($ldapConnection, LDAP_BASE_DN, $filter, $attr);
    $entries = ldap_get_entries(ldap_connect(LDAP_SERVER), $result);

    foreach ($entries[0]['memberof'] as $grps) {
        if (strpos($grps, "VPN")) {
            $access = 2;
            break;
        }

        if (strpos($grps, "Users"))
            $access = 0;
    }

    if ($access != 0) {
        $_SESSION['user'] = $login;
        $_SESSION['access'] = $access;
        return true;
    } else {
        return false;
    }

如果我尝试以这种方式连接,我会收到以下消息错误: ldap_search():搜索:操作错误 即使我一次性完成它确实有效。

如果有人可以帮助我,那就太好了......

编辑:

所以你知道,如果我对 $filter 进行 var 转储,我会得到:string'(sAMAccountName=myLogin)'。 对于 $ldapConnection,它是资源(13,ldap 链接),对于 LDAP_BASE_DN,它是字符串 'DC=myGroup, DC=fr',$attr 是数组(大小=1) 0 => 字符串'memberof'(长度=8)。

【问题讨论】:

    标签: php ldap connection


    【解决方案1】:

    经过数小时的搜索,我找到了解决方案,并将其发布在这里,以防它对某人有用: 我刚刚将这两行添加到我的 checkUsersRights 函数中:

      $ldapConn = ldap_connect(LDAP_SERVER);
        ldap_bind($ldapConn, $login, $pwd);
    

    确实在我创建新连接之前调用我的函数,但我需要在我的函数中创建它并使用 ldap_bind 正确连接。 希望有一天它会对某人有所帮助...

    【讨论】:

      【解决方案2】:

      希望对你有帮助 可能你使用的过滤器有问题 我们使用 ldap 来吸引用户 windows server 2008

      function connect_ldap_server(){
      global $ad_server,$ad_server_port;
      putenv('LDAPTLS_REQCERT=never');
      ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
      ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
      $ds=ldap_connect($ad_server,$ad_server_port); // must be a validLDAPserver!
      }
      
      
      $basedn=dc=testlab, dc=local
      
      $sr=ldap_search($ds, $basedn,"(&(objectcategory=person) (objectclass=user))");
      

      【讨论】:

      • 感谢您的回答,但正如您所见,我终于自己找到了解决方案。祝你有美好的一天!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多