ldap_search():搜索:再次出现操作错误

时间:2017-09-22 14:13:15

标签: php ldap connection

大家好,

我知道我的问题必须有一个似曾相识的一面,但我没有通过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链接,因此连接正常。

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

  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是数组(size = 1)   0 => string'memberof'(length = 8)。

2 个答案:

答案 0 :(得分:1)

我希望它会对你有所帮助 也许您使用的过滤器存在问题我们使用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))");

答案 1 :(得分:1)

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

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

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