如何在LDAP PHP中过滤用户

时间:2013-11-13 07:46:38

标签: php ldap

我正在使用LDAP登录系统。目前,我可以使用AD帐户登录系统。问题是,我的系统有两种类型的用户。 (管理员可以读写,而另一个是普通用户,只能读取)。如何在这两个用户之间进行过滤,这样当管理员登录时,他们将被带到他们的HomeScreen.php,而普通用户将被带到HomeScreen2.php。

这是我到目前为止所做的LDAP编码(不包括登录表单):

set_time_limit(30);
error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
ini_set('display_errors',1);

///config
$ldapserver = "server.name";
$ldapport    = 389;
$base_dn = "DC=xyz,DC=local";
$ldapuser  = isset($_POST['username']) ? $_POST['username'] : '';
$ldappass  = isset($_POST['password']) ? $_POST['password'] : '';
$ldaptree = "CN=ITInfra,OU=Groups,OU=MYABC,DC=xyz,DC=local";
$domain = '@abcd.local';

// connect 
$ldapconn = ldap_connect($ldapserver,$ldapport) or die ("Could not connect to LDAP  
server.");


// Set some ldap options for talking to 
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);

if ($ldapconn) {

        // binding to ldap server
        //$ldapbind = @ldap_bind($ldapconn, $ldapuser.$domain, $ldappass) or die ("<b> 
 <center><font color='red'>WARNING! : ".ldap_error($ldapconn));
        $ldapbind = @ldap_bind($ldapconn, $ldapuser.$domain, $ldappass) or
 die("<b><center><font color='red'>WARNING!<br> The username or password you entered is
incorrect");
        // verify binding
        if ($ldapbind) {
        $result = @ldap_search($ldapconn,$ldaptree, "(ou=*)") or die ("<b> 
 <center><font color='red'>Please enter username & password");
            echo "<b><center><font color='blue'> Congratulations! $ldapuser is 
 authenticated.\n";
            header('Location: HomeScreen.php');

        } else {
            echo "LDAP bind failed...\n";
        }

}

// all done? clean up
ldap_close($ldapconn);

1 个答案:

答案 0 :(得分:0)

当客户端成功BIND时,服务器已向客户端指示用户名及其相关密码是正确的 - 服务器能够验证密码是否与BIND请求中提供的密码相匹配。这就是发生的一切。如果BIND不成功,则用户名和/或密码不正确。此时LDAP对象之间没有区别。

所需要的是客户端确定username类型的方式。至少有两种合理的方法可以做到这一点:

  • LDAP对象具有指示哪种用户类型的属性。
  • LDAP对象是组的成员(在本例中为admin或normal)。

组方法比属性方法更灵活,因为新的“普通”用户或新的“管理员”用户可以简单地添加到适当的组中。

例如,管理员组:

cn=admin users,ou=groups,o=example.com
objectClass: groupOfNames
member: cn=admin user 1,ou=groups,o=example.com
member: cn=admin user 2,ou=groups,o=example.com

或普通用户组:

cn=normal users,ou=people,o=example.com
objectClass: groupOfNames
member: cn=normal user 1,ou=groups,o=example.com
member: cn=normal user 2,ou=groups,o=example.com
member: cn=normal user 3,ou=groups,o=example.com

客户端可以通过使用适当的搜索请求参数进行搜索来确定username到哪个组。如果username属于管理员组,则显示homescreen.php其他homescreen2.php

这是两种可能性。可能还有其他方法,具体取决于您的设置和服务器类型(尽管必须永远不要写LDAP客户端,就好像他们知道他们连接的服务器类型一样)。

另见