随着各种研发工具使用越来越多,单独为每个工具维护一个账号系统的开销越来越大,而且作为用户多个账号密码使用也越来越不方便。所以需要做一个统一账号登陆。

查询了多个方法,又因为之前用过LDAP,所以选择了OpenLDAP来尝试实现。

OpenLDAP安装系统信息:

Ubuntu 14.04.1 LTS/CentOS release 6.5

openldap-2.4.39

关于如何安装请参考其他资料,这里仅记录一些尝试成功的配置。

OpenLDAP Commands 例子 :
ldapsearch -xLLL -b "uid=liangji.chen,ou=People,dc=example,dc=com"

ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret -f initial.ldif

ldappasswd -x -S -D "cn=Manager,dc=example,dc=com" -w secret "uid=liangji.chen,ou=People,dc=example,dc=com"
ldapsearch -h 10.0.3.140 -p 389 -x -b "uid=liangji.chen,ou=People,dc=example,dc=com" -D "cn=Manager,dc=example,dc=com" -w secret

ldapdelete -x -D "cn=Manager,dc=example,dc=com" -w secret "uid=liangji.chen,ou=People,dc=example,dc=com"

Jenkins Configuration 例子 :
Apache + SVN configuration 例子 :
<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn

 

AuthType Basic

  AuthName "Subversion Repository"
  AuthBasicProvider ldap file
  AuthLDAPBindDN "cn=Manager,dc=example,dc=com"
  AuthLDAPBindPassword secret
  AuthLDAPURL "ldap://10.0.3.140:389/ou=People,dc=example,dc=com?uid"
</Location>
 
以下脚本会用到MigrationTools,这是下载地址 : http://www.padl.com/OSS/MigrationTools.html
添加LDAP用户的脚本 [root@linux openldap]# cat adduser.sh
#!/bin/sh
#首先创建一个linux帐户
if [ -z $1 ]; then echo "Please specify username ..."; exit; fi

useradd $1
passwd $1

export PERL5LIB=./migration/
#转gid到ldap帐户
cat /etc/group | grep $1 >/tmp/group.in
migration/migrate_group.pl /tmp/group.in > /tmp/group.ldif
ldapadd -x -D "cn=root,dc=melot,dc=cn" -w secret -f /tmp/group.ldif
#转uid到ldap帐户
cat /etc/passwd | grep $1 > /tmp/passwd.in
migration/migrate_passwd.pl /tmp/passwd.in > /tmp/passwd.ldif
ldapadd -x -D "cn=root,dc=melot,dc=cn" -w secret -f /tmp/passwd.ldif
#删掉创建的linux帐户, 使帐户成为纯粹的ldap帐户,而不是local帐户
userdel $1
#rm -rf /home/$1
#rm /tmp/group.ldif
#rm /tmp/passwd.ldif
ldapsearch -x "uid=$1"   #可用于显示刚刚添加到ldap数据库中的用户信息

 
重置LDAP用户密码的脚本 [root@linux openldap]# cat resetpass.sh
if [ -z $1 ]; then echo "Please specify username ..."; exit; fi

ldappasswd -x -S -D "cn=root,dc=melot,dc=cn" -w secret "uid=$1,ou=People,dc=melot,dc=cn"

 
提供给用户自助修改密码的网页 [root@linux htdocs]# cat ldap.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title> Reset LDAP Password</title>
<style type="text/css">
dt{
    font-weight: bold;
}
</style>
</head>
<body>
<?php
$u   = !empty($_REQUEST['u']) ? $_REQUEST['u'] : '';
$op  = !empty($_REQUEST['op']) ? $_REQUEST['op'] : '';
$np1 = !empty($_REQUEST['np1']) ? $_REQUEST['np1'] : '';
$np2 = !empty($_REQUEST['np2']) ? $_REQUEST['np2'] : '';
$an  = !empty($_REQUEST['an']) ? $_REQUEST['an'] : '';
 if(!empty($an)){
    if( empty($u) or empty($op) or empty($np1) or empty($np2) ){
        $msg = "Some filed was empty!";
    }else{
        if( $np1 != $np2  ){
            $msg = "confirm password error!";
        }else{
            if($op == $np1){
               $msg = "new password can not be same as old password!";
            }else{
                $ldap_host = "ldap://10.0.3.140";
                $ldap_port = 389;
                $base_dn   = "dc=example,dc=com";
                $connect   = @ldap_connect($ldap_host, $ldap_port);
                if(!$connect){
                    $msg = "Could not connect to LDAP server";
                }else{
                    ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
                    $user_dn   = sprintf("uid=%s,ou=People,dc=example,dc=com",$u);
                    $user_pass = $op;

$bind = @ldap_bind($connect, $user_dn, $user_pass);
                    if(!$bind){
                        $msg = sprintf("account %s old password error!",$u);
                    }else{
                        $root_dn   = "cn=Manager,dc=example,dc=com";
                        $root_pass = 'secret';
                        $bind = @ldap_bind($connect, $root_dn, $root_pass);
                        if(!$bind){
                            $msg = "Programe can not bind to LDAP server!";
                        }else{
                            $values["userPassword"][0] = "{md5}".base64_encode(pack("H*",md5($np1)));
                            $rs = @ldap_mod_replace($connect,$user_dn,$values);
                            if($rs){
                                $msg = "password modifed success!";
                            }else{
                                $msg = "password modifed failed!";
                            }
                        }
                    }
                }
                @ldap_close($connect);
            }
        }
    }
}

if(!empty($msg)){
    print("<h1>$msg</h1>");
}
?>

<form method="post" action="">
  <dl>
    <dt>添加用户,重置密码等请联系管理员,谢谢!(/root/openldap目录下有脚本)</dt>
    <dt>以下是自助修改密码:</dt>
    <dt>User Id</dt>
    <dd>uid=<input type="text" name="u" size="16" />,ou=People,dc=example,dc=com</dd>

<dt>Old Password</dt>
    <dd><input type="text" name="op" /></dd>

<dt>New Password</dt>
    <dd><input type="text" name="np1" /></dd>

<dt>Confirm Password</dt>
    <dd><input type="text" name="np2" /></dd>
    <dd><input type="submit" value="Submit" /></dd>
  </dl>
  <input type="hidden" name="an" value="submit" />
</form>
</body>
</html>

 

设置密码后不生效的情况,可以参考这里解决:http://www.linuxfly.org/post/671/

报错是:ldap_bind: Invalid credentials (49)

OpenLDAP配置信息记录的更多相关文章

  1. hadoop 配置信息记录

    ssh-keygen  -t   rsa   -P  '' 192.168.157.148 hadoop01192.168.157.149 hadoop02 mkdir  /root/hadoopmk ...

  2. 记录一次nginx的upstream的配置信息

    nginx的upstream的配置信息 upstream qq.xiaoyu.cn { server 192.168.1.139:80 max_fails=3 fail_timeout=30s; se ...

  3. outlook配置其他邮箱登录如qq邮箱或登录无邮件信息记录

    今天加班想想自己outlook还没登登录过,于是想着登录一下outlook方便管理邮箱信息,才发现原来登录邮箱都要配置,感觉真是醉了.下面开始正式的配置流程. 选择添加账户 首先,点击文件选择账户设置 ...

  4. Tomcat下conf下server.xml的文件配置信息

    Tomcat下conf下server.xml的文件配置信息,基本上不用做任何修改就可以使用,修改的地方就是host区域的一些配置,此文件设置端口为80. 注意:Tomcat配置文件中(即server. ...

  5. IIS/IIS Express/Asp.net配置片段记录

    事情的起因是,我们在项目中使用了URLRewriter.dll作为实现伪静态的工具,在VS2010及之前的开发环境中,该功能运行正常,但在VS Express 2012 for Web中就不起作用了, ...

  6. SQL2005SP4补丁安装时错误: -2146233087 MSDTC 无法读取配置信息。。。错误代码1603的解决办法

    是在安装slq2005sp3和sp4补丁的时候碰到的问题. 起先是碰到的错误1603的问题,但网上搜索的1603的解决办法都试过了,google也用了,外文论坛也读了,依然没有能解决这个问题. 其实一 ...

  7. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

  8. C#程序中获取电脑硬件配置信息的一种方法

    本文介绍获取cpu信息和内存信息的方法,根据本文所举例的代码可以举一反三获取更多信息. 获取cpu名称的方法: public string GetCpuInfo() { ManagementObjec ...

  9. Jenkins: 配置信息变更历史

    像 Jenkins 这样的系统,使用的过程就是配置文件变更的过程.如果能够对配置文件的变更进行跟踪管理,将极大的提高系统的可用性.Job Configuration History 插件就是这么一款实 ...

随机推荐

  1. QThread多线程编程经典案例分析

    传统的图形界面应用程序都只有一个线程执行,并且一次执行一个操作.如果用户调用一个比较耗时的操作,就会冻结界面响应. 一个解决方法是按照事件处理的思路: 调用 Void QApplication::pr ...

  2. MYSQL基础02(查询)

    查询是很大的一块,所以这里我只会写mysql的特点,就我目前使用的情况,MYSQL对标准SQL是比较支持,如果是新手的话,建议去w3school 学习标准SQL. 1.DUAL DUAL是一个虚拟表, ...

  3. linux之Vim使用

    Vim同Emac是Linux世界下最为流行的两个文本编辑工具,集中精力学习一个就好了,暂定以Vim为学习对象.在本文中,一些基本的操作将不再介绍,只会介绍最为常用的命令以及设置,操作系统为Ubuntu ...

  4. 配置Qt开发环境下的OpenCV开发

    1.使用CMake工具(http://www.cmak.org),选择MinGW Makefile. *一定要注意编译的版本要与Qt的mingw32的版本相同.否则容易出现undefined refe ...

  5. 《使用shell位置变量进行目录文件的备份小脚本》

    今天才发现原来位置变量也可以玩的这么爽!! 这是使用位置变量进行文件目录备份:#!/bin/bashDATE=`date +%F`  //日期以年月日输出tar czf $1.$DATE.tar.gz ...

  6. mongodb 入门笔记

    选择Mongo的关键是:这是一个 JSON 文档数据库. 1. Mongo 的术语 文档:一条完整的数据就是一个文档(对应于 MySQL 的一行). 集合:一组文档构成一个集合.类似 MySQL 中表 ...

  7. Translation002—Package Index(Android包索引)

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 看本翻译前请您注意: 本人初学android,可能有的翻译不是非常准确,但本人尽最大努力,不清楚处会做标记,并附 ...

  8. cadence16.6 如何对齐元件

    1.选中Setup-->Application Mode-->Placement Edit mode2.按"CTRL"键,选中需要对齐的所有对象.3.点击右键右,或者在 ...

  9. PAT乙级真题1016.部分A+B(15)(2016-4-28)

    原题: 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA ...

  10. Windows7 sp1 64位下安装配置eclipse+jdk+CDT+minGW

    需要的工具: jdk-7u11-windows-x64.exe  eclipse-SDK-4.2.2-win32-x86_64.zip cdt-master-8.1.2.zip mingw-get-i ...