Linux 下安装Ldap笔记 JAVA调用Ldap

Linux 下安装Ldap笔记
参考地址:http://www.yuanma.org/data/2008/0428/article_3023.htm
1、安装环境版本:
openldap-stable-20100719.tgz(openldap-2.4.23) (http://www.openldap.org
ldapweb-2.0.zip (Ldap web管理工具,需要先安装Apach服务器,后来再看看....还需要安装mysql的环境,烦,不装了)(http://sourceforge.net/projects/ldapweb
后来在使用的过程中碰到一工具 LdapSearch 3.0  ,可以用于查询 ,后面介绍

LDAP Browser/Editor v2.8.2  LDAP 编辑工具
2、所需要软件:
BDB, 在安装Ldap的过程中,提示说需要BDB的环境
在openldap-2.4.23\README 文件中也有提及,且对版本也有要求,我下载的是 db-4.6.21.tar.tar
 SLAPD:
        BDB and HDB backends require Oracle Berkeley DB 4.4, 4.5,
        4.6, 4.7, or 4.8.  It is highly recommended to apply the
        patches from Oracle for a given release.

3、安装Ldap
#tar –zxvf openldap-stable-20100719.tgz
#cd openldap-2.4.23
#./configure –prefix=/home/local/ldap        //指定安装后的目录
#make depend                                 //如果没有BDB的环境,这里会报错,关于BDB的安装见 【4】
#make
#make install

配置:
slapd.conf文件 端口默认为389
suffix      "o=hitek,c=cn"
rootdn      "cn=root,o=hitek,c=cn"    //这个就是后面登录的用户名
rootpw      123          //这里可以直接写明文,也可以用/home/local/ldap/sbin/slappasswd  生成密文
directory /home/local/ldap/var/openldap-data    //存储数据的目录
编辑可以用于导入的ldif文件
/home/local/ldap/var/openldap-data/base.ldif
dn:o=hitek,c=cn
o:hitek
objectclass:top
objectclass:organization     //这个好像是指定的

dn:ou=manager,o=hitek,c=cn    //类似于建个组
ou:manager
objectclass:top
objectclass:organizationalUnit     //这个好像是指定的

dn:cn=simbe,ou=manager,o=hitek,c=cn   //一个用户simbe
objectclass:top
objectclass:organizationalRole     //这个好像是指定的
cn:simbe
4、BDB的安装
   #tar zxvf db-4.6.21.tar.gz
   #mkdir /var/apps/db-4.6.21
   #/.../db-4.6.21/configure
   #make;make install


#tar -zxf db-4.6.21.tar.tar
#cd db-4.6.21/build_unix/
#../dist/configure --prefix=/usr/local/BerkeleyDB
#make
#make install 

//下面的可以编辑 ~/.bash_profile 加入环境变量
#export CPPFLAGS="-I/usr/local/BerkeleyDB/include"
#export LDFLAGS="-L/usr/local/BerkeleyDB/lib"   //注:如不设此环境变量,在编译openldap时,会出现以下错误  configure: error: BDB/HDB: BerkeleyDB not available
#export LD_LIBRARY_PATH="/usr/local/BerkeleyDB/lib"   //configure: error: Berkeley DB version mismatch

5、ldap  工具介绍
下载地址:http://www.baidu.com/s?wd=LdapSearch+3.0&rsv_bp=0&n=2&inputT=859

LDAP Browser/Editor v2.8.2

6、常用的一些ldap操作
开启
/home/local/ldap/libexec/slapd
关闭
kill -9
生成密码
/home/local/ldap/sbin/slappasswd
检查 search  ,ldap是否成功
ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
配置
/home/local/ldap/etc/openldap/slapd.conf
添加节点
ldapadd -x -D "cn=Manager,dc=taitien,dc=com,dc=tw" -W -f BDN.ldif
ldapadd -x -D "cn=root,o=hitek,c=cn" -W -f /home/local/ldap/var/openldap-data/base.ldif

7、JAVA调用Ldap

调用使用JNDI,不需要另外的JAR包

import java.util.Enumeration;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class Ldap
{

    private Hashtable env = null;

    private DirContext ctx = null;

    private boolean islogin = false;

    StringBuffer url;

    String host;

    String port;

    String userName;

    String password;

    String baseDN;

    public static void main(String[] args)
    {
        Ldap ldap = new Ldap();
        ldap.userLogin();
    }

    public Ldap()
    {
        try
        {
            host = "10.47.159.29";
            port = "389";
            baseDN = "o=hitek,c=cn";
            userName = "cn=root,o=hitek,c=cn";
            password = "123";
            url = new StringBuffer("LDAP://");
            url.append(host).append(":").append(port);
            url.append("/").append(baseDN);

        } catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("");
        }
        // pwd="secret";
        env = new Hashtable();

        env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
        env.put("java.naming.provider.url", url.toString());
        env.put(Context.SECURITY_AUTHENTICATION, "simple");

        env.put("java.naming.security.principal", userName);
        env.put("java.naming.security.credentials", password);
        System.out.println("-------------");
    }

    public boolean userLogin()
    {  
        Hashtable envi = new Hashtable();
        try
        {
            envi.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
            envi.put("java.naming.provider.url", url.toString());
            envi.put(Context.SECURITY_AUTHENTICATION, "simple");
            envi.put("java.naming.security.principal", userName);
            envi.put("java.naming.security.credentials", password);

            DirContext ctx = new InitialDirContext(envi);
            System.out.println("连接成功");

            SearchControls constraints = new SearchControls();
            constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String attrList[] = { "cn" };
            constraints.setReturningAttributes(attrList);
            NamingEnumeration results = ctx.search("ou=manager", "cn=abc", constraints); // 第一个值 不能有Base DN的值
            while (results.hasMore())
            {
                SearchResult si = (SearchResult) results.next();
                System.out.println(si.getName());
                Attributes attrs = si.getAttributes();
                if (attrs == null)
                {
                    System.out.println("   No attributes");
                    continue;
                }
                NamingEnumeration ae = attrs.getAll();
                while (ae.hasMoreElements())
                {
                    Attribute attr = (Attribute) ae.next();
                    String id = attr.getID();
                    Enumeration vals = attr.getAll();
                    while (vals.hasMoreElements())
                        System.out.println("   " + id + ": " + vals.nextElement());
                }
            }

            System.out.println(" 查询成功");
            // 3.添加节点
            String newUserName = "user2";
            BasicAttributes attrsbu = new BasicAttributes();
            BasicAttribute objclassSet = new BasicAttribute("objectClass");
            objclassSet.add("top");
            objclassSet.add("organizationalRole");
            attrsbu.put(objclassSet);
            attrsbu.put("ou", newUserName);
            attrsbu.put("cn", newUserName);

            ctx.createSubcontext("", attrsbu);

            System.out.println("添加节点成功");

            return true;
        } catch (Exception e)
        {
            e.printStackTrace();
            return false;
        } finally
        {
            try
            {
                if (ctx != null)
                {
                    ctx.close();
                }
            } catch (Exception ie)
            {
                ie.printStackTrace();
            }
        }
    }
}

8、LDAP错误码

代码                               值      说明
---------------------------------------------------------------------------
LDAP_SUCCESS                      0x00   请求成功。
LDAP_OPERATIONS_ERROR             0x01   LDAP 库初始化失败。
LDAP_PROTOCOL_ERROR               0x02   出现协议错误。
LDAP_TIMELIMIT_EXCEEDED           0x03   超出时间限制。
LDAP_SIZELIMIT_EXCEEDED           0x04   超出大小限制。
LDAP_COMPARE_FALSE                0x05   比较结果为 FALSE。
LDAP_COMPARE_TRUE                 0x06   比较结果为 TRUE。
LDAP_AUTH_METHOD_NOT_SUPPORTED    0x07   不支持此身份验证方法。
LDAP_STRONG_AUTH_REQUIRED         0x08   需要加强的身份验证。
LDAP_REFERRAL_V2                  0x09   LDAP 版本 2 检索。
LDAP_PARTIAL_RESULTS              0x09   接收到部分结果和检索。
LDAP_REFERRAL                     0x0a   出现检索。
LDAP_ADMIN_LIMIT_EXCEEDED         0x0b   超出服务器上的管理限制。
LDAP_UNAVAILABLE_CRIT_EXTENSION   0x0c   没有精密扩展。
LDAP_CONFIDENTIALITY_REQUIRED     0x0d   需要保密。
LDAP_NO_SUCH_ATTRIBUTE            0x10   请求的属性不存在。
LDAP_UNDEFINED_TYPE               0x11   类型未定义。 
LDAP_INAPPROPRIATE_MATCHING       0x12   出现不适当的匹配。
LDAP_CONSTRAINT_VIOLATION         0x13   出现约束冲突。
LDAP_ATTRIBUTE_OR_VALUE_EXISTS    0x14   属性已存在或已被赋值。
LDAP_INVALID_SYNTAX               0x15   语法无效。
LDAP_NO_SUCH_OBJECT               0x20   对象不存在。
LDAP_ALIAS_PROBLEM                0x21   别名无效。
LDAP_INVALID_DN_SYNTAX            0x22   辨别名的语法无效。
LDAP_IS_LEAF                      0x23   该对象为叶对象。
LDAP_ALIAS_DEREF_PROBLEM          0x24   无法取消对别名的引用。
LDAP_INAPPROPRIATE_AUTH           0x30   身份验证不正确。
LDAP_INVALID_CREDENTIALS          0x31   提供的凭据无效。
LDAP_INSUFFICIENT_RIGHTS          0x32   用户无足够的访问权限。
LDAP_BUSY                         0x33   服务器忙。
LDAP_UNAVAILABLE                  0x34   服务器不可用。
LDAP_UNWILLING_TO_PERFORM         0x35   服务器不处理目录请求。
LDAP_LOOP_DETECT                  0x36   引用链循环回至引用服务器。
LDAP_NAMING_VIOLATION             0x40   存在命名冲突。
LDAP_OBJECT_CLASS_VIOLATION       0x41   存在对象类别冲突。
LDAP_NOT_ALLOWED_ON_NONLEAF       0x42   不允许在非叶对象上操作。
LDAP_NOT_ALLOWED_ON_RDN           0x43   不允许在 RDN 上操作。
LDAP_ALREADY_EXISTS               0x44   对象已存在。
LDAP_NO_OBJECT_CLASS_MODS         0x45   无法修改对象类别。
LDAP_RESULTS_TOO_LARGE            0x46   返回的结果太大。
LDAP_AFFECTS_MULTIPLE_DSAS        0x47   多个目录服务代理受到影响。
LDAP_OTHER                        0x50   出现未知错误。
LDAP_SERVER_DOWN                  0x51   无法联系 LDAP 服务器。
LDAP_LOCAL_ERROR                  0x52   出现本地错误。
LDAP_ENCODING_ERROR               0x53   出现编码错误。
LDAP_DECODING_ERROR               0x54   出现解码错误。
LDAP_TIMEOUT                      0x55   搜索超时。
LDAP_AUTH_UNKNOWN                 0x56   出现未知的身份验证错误。
LDAP_FILTER_ERROR                 0x57   搜索筛选器不正确。
LDAP_USER_CANCELLED               0x58   用户已取消操作。
LDAP_PARAM_ERROR                  0x59   传递给例程的参数不正确。
LDAP_NO_MEMORY                    0x5a   系统内存不足。
LDAP_CONNECT_ERROR                0x5b   无法建立到服务器的连接。
LDAP_NOT_SUPPORTED                0x5c   不支持此功能。
LDAP_CONTROL_NOT_FOUND            0x5d   ldap 函数找不到指定控件。
LDAP_NO_RESULTS_RETURNED          0x5e   不支持此功能。
LDAP_MORE_RESULTS_TO_RETURN       0x5f   将返回其他结果。
LDAP_CLIENT_LOOP                  0x60   检测到客户循环。
LDAP_REFERRAL_LIMIT_EXCEEDED      0x61   超出检索限制。
LDAP_SASL_BIND_IN_PROGRESS        0x0E   多阶段绑定的中间绑定结果

猜你喜欢

转载自bdk82924.iteye.com/blog/1167748