做企业应用的也不时要与 LDAP 打交道的,例如组织架构、人员的管理,权限的分级控制等。以前管理 LDAP 都是用客户端工具 LDAP Browser 什么的,有时不甚方便。幸运的是,网上有一个现成的、功能完备的 LDAP Web 管理工具,那就是赫赫有名的 phpMyAdmin 的姊妹 phpLDAPadmin。
Web 方式的 phpLDAPadmin 利于发布,随处使用,基本上它有 LDAP Browser 客户端工具的所有功能,诸如条目管理、属性管理、导入导出、条件搜索等。还有比 LDAP Browser 所没有的 Schema 信息明细展示功能。
phpLDAPadmin 的界面截图请见: [url]http://phpldapadmin.sourceforge.net/screenshots.php[/url]
您也可以进到 phpLDAPadmin 的 Demo 站点: [url]http://thesmithfam.org/phpldapadmin-demo/htdocs/index.php[/url] 先睹为快。
本篇就来介绍 phpLDAPadmin 的安装及体验,读者最好是对 Apache、PHP、LDAP 有一定的了解。因未涉及非常具体的安装细节,只拣关键之处说明,所以如若对以上几个太过陌生的,可能中间稍有差池就要费些思量了。
一:软件准备
1. Apache HTTP Server,版本可选择 1.x 或 2.x,到 [url]http://httpd.apache.org/[/url] 下载。本文测试用的是 Apache 1.3.28。我偷了一下懒,直接用了安装 WAS 5.1 装上的 IBM HTTP Server。
2. OpenLDAP for Windows,文中版本是 2.2.29,可从 [url]http://download.bergmans.us/openldap/openldap-2.2.29/openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exe[/url] 下载。当然你也可以选择其他的版本。
3. PHP 5,本文所用版本为 5.2.6,从 [url]http://cn.php.net/distributions/php-5.2.6-Win32.zip[/url] 下载。因为这里的 phpLDAPadmin-1.1.0.5 要求是 PHP 5。
4. phpLDAPadmin,目前版本是 1.1.0.5,不过本文仍使用 1.1.0 版本,因为 1.1.0.5 我使用中有些问题,可从 [url]http://nchc.dl.sourceforge.net/sourceforge/phpldapadmin/phpldapadmin-1.1.0.zip[/url] 下载。
二:软件安装
1. Apache 的安装
这个东西的安装、启动和停止就不多说了,用 %APACHE_HOME% 表示 Apache 的安装目录。
2. OpenLDAP 的安装配置
请参考之前写过的一篇日志: Windows下安装使用openldap。 当然,你也可以藉此连接到一个已有的 LDAP 服务器,那么这一步就可以直接跳过。
只是我们将使用 OpenLDAP Samples( [url]http://www.zytrax.com/books/ldap/ch5/index.html[/url]) 中的目录结构。所以与前面不同的是要把 OpenLDAP 安装目录下的 slapd.conf 中的 suffix、rootdn 和 rootpw 分别改为如下:
suffix "dc=example,dc=com"
rootdn "cn=jimbob,dc=example,dc=com"
rootpw dirtysecret
然后拷贝下面文本框中的内容保存为 example.ldif 文件,比如放在 C 盘根目录下。
version: 1 # 为: dc=example,dc=com,导出LDIF # 由phpLDAPadmin ( [url]http://phpldapadmin.sourceforge.net/[/url] ) 在 September 11, 2008 8:33 am上生成的 # 服务器: My LDAP Server (10.128.12.16) # 搜索范围: sub # 搜索过滤器: (objectClass=*) # 条目总数: 15 dn: dc=example,dc=com dc: example description: My wonderful company as much text as you want to place in this line up to 32K continuation data for the line above must have or < LF> i.e. ENTER works on both Windows and *nix system - new line MUST begin with ONE SPACE objectClass: dcObject objectClass: organization o: Example, Inc. dn: ou=customers,dc=example,dc=com objectClass: organizationalUnit ou: customers description: customer address book branch dn: ou=equipment,dc=example,dc=com objectClass: organizationalUnit ou: equipment description: IT assets branch dn: cn=LP1,ou=equipment,dc=example,dc=com objectClass: device cn: LP1 description: Some brand of printer serialNumber: 1-77-23-15 l: Room 17 owner: cn=John Smith,ou=people,dc=example,dc=com ou: printers dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups description: generic groups branch dn: cn=hrpeople,ou=groups,dc=example,dc=com objectClass: groupOfNames cn: hrpeople description: Human Resources group member: cn=Robert Smith,ou=people,dc=example,dc=com dn: cn=itpeople,ou=groups,dc=example,dc=com objectClass: groupOfNames cn: itpeople description: IT security group member: cn=William Smith,ou=people,dc=example,dc=com dn: cn=salespeople,ou=groups,dc=example,dc=com objectClass: groupOfNames cn: salespeople description: Sales group member: cn=John Smith,ou=people,dc=example,dc=com dn: ou=people,dc=example,dc=com ou: people description: All people in organisation objectClass: organizationalUnit dn: cn=John Smith,ou=people,dc=example,dc=com objectClass: inetOrgPerson cn: John Smith cn: John J Smith sn: Smith uid: jsmith userPassword: jSmitH carLicense: HISCAR 124 homePhone: 555-111-2223 mail: <a href='mailto:
[email protected]'>
[email protected]</a> mail: <a href='mailto:
[email protected]'>
[email protected]</a> mail: <a href='mailto:
[email protected]'>
[email protected]</a> ou: Sales dn: ou=addressbook,cn=John Smith,ou=people,dc=example,dc=com objectClass: organizationalUnit ou: addressbook description: Personal Address Book dn: cn=Robert Smith,ou=people,dc=example,dc=com objectClass: inetOrgPerson cn: Robert Smith cn: Robert J Smith cn: bob smith sn: smith uid: rjsmith userPassword: rJsmitH carLicense: HISCAR 123 homePhone: 555-111-2222 mail: <a href='mailto:
[email protected]'>
[email protected]</a> mail: <a href='mailto:
[email protected]'>
[email protected]</a> mail: <a href='mailto:
[email protected]'>
[email protected]</a> description: swell guy ou: Human Resources dn: ou=addressbook,cn=Robert Smith,ou=people,dc=example,dc=com objectClass: organizationalUnit ou: addressbook description: Personal Address Book dn: cn=Sheri Smith,ou=people,dc=example,dc=com objectClass: inetOrgPerson cn: Sheri Smith sn: smith uid: ssmith userPassword: sSmitH carLicense: HERCAR 125 homePhone: 555-111-2225 mail: <a href='mailto:
[email protected]'>
[email protected]</a> mail: <a href='mailto:
[email protected]'>
[email protected]</a> mail: <a href='mailto:
[email protected]'>
[email protected]</a> ou: IT dn: ou=addressbook,cn=Sheri Smith,ou=people,dc=example,dc=com objectClass: organizationalUnit ou: addressbook description: Personal Address Book
接着在 slapd -d 1 启动了 OpenLDAP 后,再用命令
ldapadd -x -D "cn=jimbob,dc=example,dc=com" -w dirtysecret -f c:\example.ldif
导入到 OpenLDAP 中。导入后 LDAP 的目录结构如下图所示:
3. PHP 的配置
下载的 PHP 解压到某个目录下,用 %PHP_HOME% 表示这个目录。
关于 PHP 与 Apache 的结合,参考 %PHP_HOME% 目录下的 install.txt 文件。简单说就是:
1) 修改 %APACHE_HOME%\conf\httpd.conf 文件,我们以 Apache module 模块方式配置,在末尾加上下面三行
LoadModule php5_module "%PHP_HOME%/php5apache.dll"
#对于 Apache 2 则加载 php5apache2.dll,写成
#LoadModule php5_module "%PHP_HOME%/php5apache2.dll"
AddType application/x-httpd-php .php
#指定 php.ini 文件的置,默认是在 %windir% 目录下
PHPIniDir "%PHP_HOME%/"
说明:%PHP_HOME% 替换为实际的路径
2) 把 %PHPE_HOME%/php.ini-recommended 文件更名为 php.ini,然后修改其中的
extension_dir = "%PHP_HOME%/ext"
然后把 extension=php_gettext.dll 和 extension=php_ldap.dll 前面的分号(;) 注释符去掉,保存。明显我们的 php 要用到 ldap 库,还有在 phpLDAPadmin 中使用了 GETTEXT 来实现国际化。
3) 还要使得 Apache 启动时能加载到 %PHP_HOME% 下的 libeay32.dll 和 ssleay32.dll 这两个文件,我们不妨把这两个文件拷到 %APACHE_HOME% 目录下即可。
4) 最后我们来测试一下 PHP 安装是否成功,在 %APACHE_HOME%/conf/httpd.conf 的 DocumentRoot 所指向的站点主目录中新建一个 phpinfo.php,在里面写上:
<?php phpinfo(); ?>
启动 Apache,在浏览器中用 [url]http://localhost/phpinfo.php[/url] 看看是不是显示了 php 的相关信息,并且能找到启用了 LDAP 和 GETTEXT,OK,到这一步就完成一大半了。
4, phpLDAPadmin 的安装配置
1) 把下载的 phpLDAPadmin 解压到 Apache 的站点主目录中,目录命名为 phpldapadmin,如 %APACHE_HOME%/htdocs/phpldapadmin,用 %PHP_LDAP_ADMIN_HOME% 来表示这个目录。
2) 把 %PHP_LDAP_ADMIN_HOME% /config/config.php.example 更名为 config.php,这个文件中对于各项的配置有很详细的说明。
3) 修改以上的 config.php 文件
注意,如果是连接用来连接到本机的 389 端口上的 LDAP 服务,不用修改此文件都行,到时在界面上直接输入登录用户的 DN 和密码即可。
在该文件中找到行
$ldapservers->SetValue($i,'server','name','My LDAP Server');
并把这一行随后的
// $ldapservers->SetValue($i,'server','host','127.0.0.1');
// $ldapservers->SetValue($i,'server','port','389');
// $ldapservers->SetValue($i,'server','base',array(''));
// $ldapservers->SetValue($i,'server','auth_type','cookie');
# $ldapservers->SetValue($i,'login','dn','cn=Manager,dc=example,dc=com');
# $ldapservers->SetValue($i,'login','pass','secret');
去掉注释符(// 或 #),再依据前面的 OpenLDAP 配置依次改为
$ldapservers->SetValue($i,'server','host','localhost');
$ldapservers->SetValue($i,'server','port','389');
$ldapservers->SetValue($i,'server','base',array('dc=example,dc=com'));
$ldapservers->SetValue($i,'server','auth_type','cookie');
$ldapservers->SetValue($i,'login','dn','cn=jimbob,dc=example,dc=com');
$ldapservers->SetValue($i,'login','pass','dirtysceret');
以上那个属性不设置,则取默认值,如默认 host 为 localhost,port 为 389,base 为空则自动检测,auth_type 为 cookie,dn 和 pass 不设值则要求界面输入。
3) 如果要同时管多个 LDAP 服务器,则可在这个 config.php 文件中参照 $i++; 所在的注释块配置其他的 LDAP 服务器参数,配置了多个可以在 WEB 界面上通过下拉选择当前的的 LDAP 服务器。
三. 体验 phpLDAPadmin
在浏览器上访问 [url]http://localhost/phpldapadmin/index.php[/url], 点击左侧 My LDAP Server 下的 Login ...,输入 登录 DN 为 cn=jimbob,dc=example,dc=com 和密码为:dirtysecret,点击认证按钮就能连接上 LDAP 服务器进行管理了。这里挂上一个搜索的界面。
四. 一些问题
1. 为什么用 phpLDAPadmin 1.1.0,而不用目前最新版 1.1.0.5,因为 1.1.0.5 主要有两个问题:
1) 经常页面出现乱码,每次需手工选择网页编码为 UTF-8,1.1.0 下正常。
2) 即使在 config.php 中提供了登录 DN 和 密码,auth-type 是 cookie,也是不能自己登录的,一定要输入密码手工点一点认证按钮,1.1.0 下正常
2. 注意 PHP 的版本,以及是否开启了 LDAP 和 GETTEXT 支持。我首先拿到的 phpLDAPadmin 版本是 1.1.0-alpha3,看其中的 INSTALL 文件里写着的是:
PHP 4.1.0 or newer (with LDAP support)
其实我还是比较大方的,直接用了 PHP 4.4.9 来伺候它,LDAP 也开了,结果它不领情。出现了这样的错误:
php unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'
定位在 PHP 类的变量声明上,如 public、private 和 clone 操作上,原因是 PHP 4 不支持这个,只能用 var,所以要换 PHP 5 才行。
还有 phpLDAPadmin 绝口未提要 GETTEXT 来支持它的国际化,害我从源代码中才翻出这一底细,即使是后续版本也对此默声不语。况且 PHP 4 本身就没有内置对 GETTEXT 的支持,尝试着安装 gettext for Win32 也不奏效,那就顺手移到 PHP5 上吧,在 php.ini 中把 GETTEXT 也打开,一切解决。
在 phpldapadmin/htdocs/index.php 中有这么一段代码:
# Make sure this PHP install has gettext, we use it for language translation
if (! extension_loaded('gettext'))
pla_error('<p>Your install of PHP appears to be missing GETTEXT support.</p><p>GETTEXT is used for language translation.</p><p>Please install GETTEXT support before using phpLDAPadmin.<br /><small>(Dont forget to restart your web server afterwards)</small></p>');
3. 有关 php.ini 和 config.php 的详细配置见这两文件本身吧,它们是自文档的,例如可以适当的裁剪一些 PHP 的功能。以及 PHP 和 Apache 的搭配也应见 PHP 的 install.txt。最后为方便访问,在 Apache 的 httpd.conf 中为
DirectoryIndex index.html index.php
把 index.php 也加上,如上形式。
本篇只关注如何配置 phpLDAPadmin 使用,碰到问题实际解决而已。旨在为我们开发中使用 LDAP 提供一个便利的工具而已,或有些用处。不用在 PHP 上纠缠,毕竟 PHP 太久没用过了,也不清楚现在演化成什么样子了。
4. 另外,若是你的 phpLDAPadmin 页面要加载的数据信息过于庞大时,建议用 FireFox,因为 FireFox 与 IE 的机制不一样,FireFox 首先会申请一大块内存,所以显示大量数据信息的页面时不会像 IE 那样拖不动。用 FireFox 和 IE 分别试着访问一下 Blogjava 首页面的,更多博客连接 [url]http://www.blogjava.net/AllBloggers.aspx[/url] 就知道了。