`
gogo1217
  • 浏览: 152097 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

2款 wordpress LDAP插件 链接服务器的BUG修复

阅读更多

版权所有,转载请注明来源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检索,并且发现本地没有用户,则创建一个新的用户并赋予指定的角色。

  • 描述: Simple-LDAP-Login.php修改
  • 大小: 116.3 KB
  • 大小: 102.6 KB
  • 大小: 145.1 KB
分享到:
评论
1 楼 gogo1217 2013-10-01  
发现Simple LDAP Login插件的LDAP中文乱码问题,已经更新。

相关推荐

    禅道开源版11.5LDAP插件

    在实际部署和使用禅道开源版11.5 LDAP插件时,管理员需要了解如何配置和测试 LDAP 连接,确保插件与现有 LDAP 服务器的兼容性。同时,还要关注安全性问题,如正确设置认证策略,避免敏感信息泄露。 通过这个插件,...

    sonarqube ldap 插件1.3

    sonarqube ldap 插件1.3

    禅道18.2开源版ldap插件

    在实际应用中,ldap插件支持多种 LDAP 服务器,如Active Directory、OpenLDAP等。同时,它还支持多级组织结构,可以根据企业的部门划分同步用户和组信息。这样,当企业的人事变动时,只需在LDAP服务器上更新,禅道内...

    使用Delphi连接LDAP服务器

    本篇文章将深入探讨如何使用Delphi来连接并操作LDAP服务器。 首先,我们需要了解Delphi中的组件库提供了哪些工具来处理LDAP连接。`TADOConnection`和`TADODataset`等组件是Delphi与数据库交互的基础,但它们并不...

    LdapBrowser ldap连接工具

    2. **连接管理**:支持创建、保存和管理多个LDAP服务器连接,适应多环境下的工作需求。 3. **目录浏览**:能够显示 LDAP 树结构,便于查看和查找目录中的对象。 4. **对象操作**:允许用户创建、修改、删除和搜索...

    LDAP服务器资料,很经典的

    【LDAP服务器介绍】 LDAP(Lightweight Directory Access Protocol)是一种轻量级目录访问协议,它源自上世纪80年代的国际电报电话协商委员会(CCITT)和国际标准组织ISO的需求,旨在提供一种查找电话号码和电子...

    sonarqube ldap 插件1.5.1

    sonar-ldap-plugin-1.3.jar

    连接ldap服务器实例

    这是一个可以登录ldap服务器并取出想要的结果 的一个简单例子。..

    服务器搭建之十四LDAP服务器.docx

    本文将详细介绍如何在Xubuntu操作系统上搭建一个基于slapd、ldap-utils、db-util、phpldapadmin和apache2的LDAP服务器。尽管在尝试过程中遇到了问题,但我们将按步骤解析整个过程,以便于理解可能出现的问题。 首先...

    什么是LDAP连接工具?如何利用好它.docx

    **LDAP 连接工具详解与应用** LDAP(Lightweight Directory Access Protocol)是一种网络协议,用于在互联网上查询和管理分布式目录服务。它提供了一种高效、简洁的方式,使得用户能够检索和更新存储在目录服务器中...

    非常好用的ldap连接工具

    **LDAP(Lightweight Directory Access Protocol)连接工具是用于管理和访问 LDAP 目录服务的重要软件,它使得用户可以方便地查询、编辑和管理存储在 LDAP 服务器中的数据。ApacheDirectoryStudio 是一个开源、跨...

    php-ldap插件

    php的ldap插件,可以再mac、linux下使用。编译好的文件,直接拷贝到ext下即可。

    ldap 使用指南

    2. 安装和配置要求:文档中提到了Fuel和预先配置好的LDAP服务器是使用LDAP插件的前提条件。LDAP服务器需要在部署前预配置,并且从控制节点的公共网络上可以访问。 3. 插件限制:文档指出了LDAP插件的一些限制。例如...

    LDAP连接工具-方便开发人员的工具

    "LDAP连接工具"是为了方便开发人员与LDAP服务器进行交互而设计的实用程序,它简化了在大数据集群环境中设置权限和管理用户验证的过程。 **LDAP基础概念** 1. **目录服务**: LDAP提供的一种服务,它存储和组织数据...

    基于Centos5.2系统安装LDAP通信录服务器详解

    2. 配置 slapd(LDAP 服务器守护进程): 安装完成后,需要配置 slapd。主要配置文件为 `/etc/openldap/slapd.conf`。在这个文件中,你可以定义 LDAP 服务器的基本设置,包括数据库类型、数据存储位置、日志级别等...

    java 连接ldap 服务器源码

    Java连接LDAP服务器是一种常见的任务,尤其在企业级应用中,用于身份验证、用户管理或访问控制。LDAP(轻量级目录访问协议)是一种基于X.500标准的目录服务协议,它允许快速查找和管理分布式数据库中的信息。在Java...

    图解使用Domino建立LDAP服务器的过程

    在本文中,我们将探讨如何使用Domino 6.5.4建立一个LDAP(轻量级目录访问协议)服务器。这个过程涉及几个关键步骤,包括启用和配置LDAP服务,创建和配置Domino目录服务数据库,设置全局网络域,以及测试LDAP服务是否...

    理解与应用LDAP服务器

    在实际应用中,LDAP不仅可以用于存储用户账号信息,还可以与其他系统集成,如邮件服务器(如Postfix)、认证服务(如Samba)等。通过LDAP,管理员可以集中管理用户账户,实现单点登录(Single Sign-On,SSO)功能,...

    理解与应用ldap服务器

    【LDAP(轻量级目录访问协议)的理解与应用】 LDAP是一种用于访问和管理分布式目录服务的协议,主要用于存储和检索用户、组、网络资源等信息。尽管“轻量级”可能让人误解其复杂性,但事实上,LDAP简化了目录服务的...

Global site tag (gtag.js) - Google Analytics