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 多阶段绑定的中间绑定结果