设置 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 系统而异。我们不仅要显示的是活跃用户,但也其名称必须以一开始,他们必须住在阿姆斯特丹。
基本上我们想做三件事:
- 最简单:必须住在阿姆斯特丹。在此示例中,居住地存储在属性
postaladdress
中
$filter= "postaladdress=Amsterdam";
- 名称必须以
a
开头。在此示例中,UID 由名称组成,因此:
$filter= "uid=a*";
- 用户必须处于活动状态该值存储在默认属性
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*))";
你可以无休止地结合并构建相当令人印象深刻的过滤器,享受尝