设置 PHP 以使用 LDAP

正确配置 LDAP 服务器后,现在我们要连接。例如,通过使用 PHP。

  • DN =专有名称。这意味着,你正在使用数据库的哪个部分。可以是用户或组(甚至是配置设置)。
  • 条目:实体,例如用户。
  • 属性:条目中的内容,例如姓名,电话号码和电子邮件地址。

首先,我们定义以下内容:

$server = "server.example.com";  //this is the LDAP server you're connecting with
$ds = ldap_connect("ldaps://$server", 636); //always connect securely via LDAPS when possible

现在,我们相互联系。我们想要的下一件事是让服务器知道我们是一个值得信赖的人。最简单的解决方案是使用根 DN 或具有适当权限的现有用户来查看数据库(可能默认情况下,数据库中的每个用户都可以执行此操作)。我们使用 bind 函数进行身份验证。

设置选项

首先,我们声明这些选项。根据你的服务器配置,你可以将其保留。

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);

绑定

假设你使用的是 admin,密码是 pass123notsafe

$dn = "uid=admin,cn=users,dc=server,dc=example,dc=com";
$pass = "pass123notsafe";
$ldapbind = ldap_bind($ds, $dn, $pass); //this is the point we are authenticating

那太好了。我们在。现在我们可以执行许多不同的操作。例如,我们可以搜索,读取,编写和修改用户甚至组。

搜索

想象一下,我们想要显示组用户的所有成员。

$dn = "cn=users,dc=server,dc=example,dc=com"; //very important: in which part of your database are you looking
$filter = "uid=*"; //don't filter anyone out (every user has a uid)
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

$results = ldap_get_entries($ds, $sr); //here we are pulling the actual entries from the search we just defined
var_dump($results); //will give you all results is array form. 

你可以使用 foreach 循环以一种很好的方式显示数据。

好的,有这个吗?现在继续进行一些过滤。我们只想显示已注册电子邮件地址的自行车所有者组中的用户。知道所有用户都在 cn = users 中非常重要。除此之外,他们也可以是其他组的成员。

//did the connecting and binding

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com"; //note the extra "cn=groups" for looking in a group that is not "users"
$filter = "email=*"; //email address must be set but can be anything
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

现在再次进行 ldap_get_entries

获得参赛作品的效率

解决效率的一个例子,对于每个条目具有大量属性的大型数据库而言越来越重要。特别是当你在属性 jpegphoto 中存储图片时,当你有选择地拉动条目时,它可能会显着减少你的加载时间。

想象一下,我们想要寻找自行车所有者组中的用户。这些条目中存储了大量信息,假设它们具有以下属性:cn,uid,name,displayname,mail,initials,mobile,telephonenumber,street,postaladdress,postalcode 和 jpegphoto。现在我们只需要他们的 uid,名字和首字母。

为此,我们使用 ldap_search 的可选第 4 个参数:

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com";
$filter = "uid=*"; //
$justhese = array("uid", "name", "initials");
$sr = ldap_search($ds, $dn, $filter, $justthese) or die ("bummer"); //define your search scope

瞧,运行 ldap_get_entries 只会给你这些数据。

高级过滤

当然,你可以使用 LDAP 提取整个数据库,并在 PHP 中进一步处理。但是,就像 MySQL 一样,处理服务器端的效率要高得多。为了证明这一点,我们可以使用高级过滤器。

以上面的示例之一作为起点,但根据下面的行更改$ filter。在我们的示例中,我们希望显示活动用户的数据。通常,属性 shadowexpire 用于存储此信息。但是,这可能因各种 LDAP 系统而异。我们不仅要显示的是活跃用户,但其名称必须以开始,他们必须住在阿姆斯特丹。

基本上我们想做三件事:

  1. 最简单:必须住在阿姆斯特丹。在此示例中,居住地存储在属性 postaladdress
$filter= "postaladdress=Amsterdam";
  1. 名称必须以 a 开头。在此示例中,UID 由名称组成,因此:
$filter= "uid=a*";
  1. 用户必须处于活动状态该值存储在默认属性 shadowexpire 中,值为 -1。根据你的服务器配置,shadowexpire 可以保存无数的值,甚至可以使用日期。如果用户处于非活动状态,则 shadowexpire 将为 1。为了确保我们获得所有用户,除了那些非常不活跃的用户,我们不会选择过滤 shadowexpire = -1。相反,我们说我们希望它们不活跃。
$filter= "(!(shadowexpire=1))"; //NOT is represented with "!"

现在最有趣的部分:结合所有三个例子。我们可以使用括号,AND,OR 和 NOT 表达式来完成此操作

$filter= "(&(postaladdress=Amsterdam)(uid=a*)(!(shadowexpire=1)))";

最后,我们可以使用“|”构建 OR 语句,例如,如果我们希望所有用户以 ab 开头

$filter= "(|(uid=a*)(uid=n*))";

你可以无休止地结合并构建相当令人印象深刻的过滤器,享受尝