版权所有,转载请注明来源http://gogo1217.iteye.com,违者必究!
今天安装了下wordpress,主要用于团队内部技术交流和分享。它的安装倒是非常简单,修改下数据库配置文件就可以了。但由于团队的账号全部采用LDAP进行管理,因此希望wordpress能与ldap进行集成。
好在wordpress比较成熟,有多种LDAP插件可以使用,在尝试了Simple LDAP Login和Active Directory Integration均告知失败的情况下,只好潜心去看下它的代码,代码倒简单,加上之前写过一个简单的PHP修改LDAP密码的页面,很快就定位问题并圆满解决了。
1、现将问题的修改过程和大家分享,先说下我们LDAP的组织情况,我们在LDAP创建了2个组,一个用户组,一个角色分组,用户分组按照组织架构进行区分,如下图所示:
+dc=foo,dc=bar,dc=com -+ou=roles -+ou=users --+ou=dev ---+ou=dev09 ----+uid=zhangsan
因此我们base_dn为 dc=foo,dc=bar,dc=com
2、Simple LDAP Login插件修改:
a).下载并启用Simple LDAP Login
b).在设置项中找到Simple LDAP Login的配置页面,填写Simple选项卡中配置baseDN、LDAP的服务器IP地址,并在Advance配置LDAP Login Attribute为uid。
c).保存后,发现输入正确的用户名和密码后,无法登陆。
d).翻了翻插件的源码才发现在Simple-LDAP-Login.php中ldap_auth方法存在问题。他将我们配置的uid、输入的用户名和配置baseDN链接在一起,即得到的是“uid=zhangsan,dc=foo,dc=bar,dc=com”作为用户的dn查找,而该正确的查找应该为“uid=zhangsan,ou=dev1,ou=dev1,ou=dev,ou=users,dc=foo,dc=bar,dc=com”,因此总是提示我们无法登陆。
function ldap_auth( $username, $password, $directory ) { $result = false; if ( $directory == "ad" ) { $result = $this->adldap->authenticate( $username, $password ); } elseif ( $directory == "ol" ) { $this->ldap = ldap_connect( join(' ', (array)$this->get_setting('domain_controllers')), (int)$this->get_setting('ldap_port') ); ldap_set_option($this->ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$this->get_setting('ldap_version')); if ( str_true($this->get_setting('use_tls')) ) { ldap_start_tls($this->ldap); } $ldapbind = @ldap_bind($this->ldap, $this->get_setting('ol_login') .'=' . $username . ',' . $this->get_setting('base_dn'), $password); $result = $ldapbind; } return apply_filters($this->prefix . 'ldap_auth', $result); }
e).修改查找部分,先用uid去查找正确的dn,然后用正确的dn和password去绑定,红色部分为修改。
f).最终代码如下:
function ldap_auth( $username, $password, $directory ) { $result = false; if ( $directory == "ad" ) { $result = $this->adldap->authenticate( $username, $password ); } elseif ( $directory == "ol" ) { $this->ldap = ldap_connect( join(' ', (array)$this->get_setting('domain_controllers')), (int)$this->get_setting('ldap_port') ); ldap_set_option($this->ldap, LDAP_OPT_PROTOCOL_VERSION, (int)$this->get_setting('ldap_version')); if ( str_true($this->get_setting('use_tls')) ) { ldap_start_tls($this->ldap); } //add by gogo1217 $search=@ldap_search($this->ldap,$this->get_setting('base_dn'),$this->get_setting('ol_login') .'=' .$username); $dn=@ldap_get_entries($this->ldap,$search); //从获取到的数组取出用户dn,没有用户dn修改不了密码。 for ($i=0; $i<$dn["count"]; $i++){ $user_dn= $dn[$i]["dn"]; } $ldapbind = @ldap_bind($this->ldap, $user_dn, $password); //end by gogo1217 //$ldapbind = @ldap_bind($this->ldap, $this->get_setting('ol_login') .'=' . $username . ',' . $this->get_setting('base_dn'), $password); $result = $ldapbind; } return apply_filters($this->prefix . 'ldap_auth', $result); }
g).LDAP中姓名中文乱码问题:
这是因为插件中对中文进行了转码,去掉转码即可,删除红颜色部分中的sanitize_title函数包裹:
3、Active Directory Integration插件修改:
a).下载并启用Active Directory Integration;
b).在配置模块中找到Active Directory Integration Settings,填写Server选项卡中的LDAP的服务器IP地址和baseDN。
c).保存后,发现输入正确的用户名和密码后,无法登陆。
d).翻了翻插件的源码,发现使用ad_ldap/adLDAP.php来链接LDAP,他将输入的用户名和我们在User配置页面中用户后缀链接在一起,由于我没有配置后缀即得到的是“zhangsan”作为用户的dn查找,而该正确的查找应该为“uid=zhangsan,ou=dev1,ou=dev1,ou=dev,ou=users,dc=foo,dc=bar,dc=com”,因此总是提示我们无法登陆。
/** * Validate a user's login credentials * * @param string $username A user's AD username * @param string $password A user's AD password * @param bool optional $prevent_rebind * @return bool */ public function authenticate($username, $password, $prevent_rebind = false) { // Prevent null binding if ($username === NULL || $password === NULL) { return false; } if (empty($username) || empty($password)) { return false; } // Bind as the user $ret = true; $this->_bind = @ldap_bind($this->_conn, $username . $this->_account_suffix, $password); if (!$this->_bind){ $ret = false; }
e).修改查找部分,先用uid去查找正确的dn,然后用正确的dn和password去绑定,红色部分为修改。
f).最终代码如下:
/** * Validate a user's login credentials * * @param string $username A user's AD username * @param string $password A user's AD password * @param bool optional $prevent_rebind * @return bool */ public function authenticate($username, $password, $prevent_rebind = false) { // Prevent null binding if ($username === NULL || $password === NULL) { return false; } if (empty($username) || empty($password)) { return false; } // Bind as the user $ret = true; //add by liushimin $search=@ldap_search($this->_conn,$this->_base_dn,"uid=".$username); $dn=@ldap_get_entries($this->_conn,$search); //从获取到的数组取出用户dn,没有用户dn修改不了密码。 for ($i=0; $i<$dn["count"]; $i++){ $user_dn= $dn[$i]["dn"]; } //end by liushimin $this->_bind = @ldap_bind($this->_conn, $user_dn, $password); //$this->_bind = @ldap_bind($this->_conn, $username . $this->_account_suffix, $password); if (!$this->_bind){ $ret = false; }
4、对比2个插件,都是在用户登陆的时候去LDAP检索,并且发现本地没有用户,则创建一个新的用户并赋予指定的角色。
相关推荐
在实际部署和使用禅道开源版11.5 LDAP插件时,管理员需要了解如何配置和测试 LDAP 连接,确保插件与现有 LDAP 服务器的兼容性。同时,还要关注安全性问题,如正确设置认证策略,避免敏感信息泄露。 通过这个插件,...
sonarqube ldap 插件1.3
在实际应用中,ldap插件支持多种 LDAP 服务器,如Active Directory、OpenLDAP等。同时,它还支持多级组织结构,可以根据企业的部门划分同步用户和组信息。这样,当企业的人事变动时,只需在LDAP服务器上更新,禅道内...
本篇文章将深入探讨如何使用Delphi来连接并操作LDAP服务器。 首先,我们需要了解Delphi中的组件库提供了哪些工具来处理LDAP连接。`TADOConnection`和`TADODataset`等组件是Delphi与数据库交互的基础,但它们并不...
2. **连接管理**:支持创建、保存和管理多个LDAP服务器连接,适应多环境下的工作需求。 3. **目录浏览**:能够显示 LDAP 树结构,便于查看和查找目录中的对象。 4. **对象操作**:允许用户创建、修改、删除和搜索...
【LDAP服务器介绍】 LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,它源自上世纪80年代的国际电报电话协商委员会(CCITT)和国际标准组织ISO的需求,旨在提供一种查找电话号码和电子...
sonar-ldap-plugin-1.3.jar
这是一个可以登录ldap服务器并取出想要的结果 的一个简单例子。..
本文将详细介绍如何在Xubuntu操作系统上搭建一个基于slapd、ldap-utils、db-util、phpldapadmin和apache2的LDAP服务器。尽管在尝试过程中遇到了问题,但我们将按步骤解析整个过程,以便于理解可能出现的问题。 首先...
**LDAP 连接工具详解与应用** LDAP(Lightweight Directory Access Protocol)是一种网络协议,用于在互联网上查询和管理分布式目录服务。它提供了一种高效、简洁的方式,使得用户能够检索和更新存储在目录服务器中...
**LDAP(Lightweight Directory Access Protocol)连接工具是用于管理和访问 LDAP 目录服务的重要软件,它使得用户可以方便地查询、编辑和管理存储在 LDAP 服务器中的数据。ApacheDirectoryStudio 是一个开源、跨...
php的ldap插件,可以再mac、linux下使用。编译好的文件,直接拷贝到ext下即可。
2. 安装和配置要求:文档中提到了Fuel和预先配置好的LDAP服务器是使用LDAP插件的前提条件。LDAP服务器需要在部署前预配置,并且从控制节点的公共网络上可以访问。 3. 插件限制:文档指出了LDAP插件的一些限制。例如...
"LDAP连接工具"是为了方便开发人员与LDAP服务器进行交互而设计的实用程序,它简化了在大数据集群环境中设置权限和管理用户验证的过程。 **LDAP基础概念** 1. **目录服务**: LDAP提供的一种服务,它存储和组织数据...
2. 配置 slapd(LDAP 服务器守护进程): 安装完成后,需要配置 slapd。主要配置文件为 `/etc/openldap/slapd.conf`。在这个文件中,你可以定义 LDAP 服务器的基本设置,包括数据库类型、数据存储位置、日志级别等...
Java连接LDAP服务器是一种常见的任务,尤其在企业级应用中,用于身份验证、用户管理或访问控制。LDAP(轻量级目录访问协议)是一种基于X.500标准的目录服务协议,它允许快速查找和管理分布式数据库中的信息。在Java...
在本文中,我们将探讨如何使用Domino 6.5.4建立一个LDAP(轻量级目录访问协议)服务器。这个过程涉及几个关键步骤,包括启用和配置LDAP服务,创建和配置Domino目录服务数据库,设置全局网络域,以及测试LDAP服务是否...
在实际应用中,LDAP不仅可以用于存储用户账号信息,还可以与其他系统集成,如邮件服务器(如Postfix)、认证服务(如Samba)等。通过LDAP,管理员可以集中管理用户账户,实现单点登录(Single Sign-On,SSO)功能,...
【LDAP(轻量级目录访问协议)的理解与应用】 LDAP是一种用于访问和管理分布式目录服务的协议,主要用于存储和检索用户、组、网络资源等信息。尽管“轻量级”可能让人误解其复杂性,但事实上,LDAP简化了目录服务的...