1

我正在使用 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);
4

1 回答 1

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.phpelse homescreen2.php

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

也可以看看

于 2013-11-13T12:45:58.043 回答