ldap开始使用ldap

备注

本节概述了ldap是什么,以及开发人员可能想要使用它的原因。

它还应该提到ldap中的任何大型主题,并链接到相关主题。由于ldap的文档是新的,您可能需要创建这些相关主题的初始版本。

设置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语句,例如,如果我们希望所有用户以“a”或“b”开头

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

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