1. LDAP简介
OpenLDAP官网 https://www.openldap.org/
Ldap中文网 http://www.ldap.org.cn/
LDAP的特点
1.LDAP 是一种网络协议而不是数据库,而且LDAP的目录不是关系型的,没有RDBMS那么复杂,
2.LDAP不支持数据库的Transaction机制,纯粹的无状态、请求-响应的工作模式。
3.LDAP不能存储BLOB,LDAP的读写操作是非对称的,读非常方便,写比较麻烦,
4.LDAP支持复杂的查询过滤器(filter),可以完成很多类似数据库的查询功能。
5.LDAP使用树状结构,接近于公司组织结构、文件目录结构、域名结构等我们耳熟能详的东东。 LDAP使用简单、接口标准,并支持SSL访问。
LDAP与NIS相比
1.LDAP是标准的、跨平台的,在Windows下也能支持。
2.LDAP支持非匿名的访问,而且有比较复杂的访问控制机制(如ACL),安全性似乎更好一些。
3.LDAP支持很多复杂的查询方式。
4.LDAP的用途较NIS更为广泛,各种服务都可以和LDAP挂钩。
LDAP的主要应用场景
1.网络服务:DNS服务
2.统一认证服务:
3.Linux PAM (ssh, login, cvs. . . )
4.Apache访问控制
5.各种服务登录(ftpd, php based, perl based, python based. . . )
6.个人信息类,如地址簿
7.服务器信息,如帐号管理、邮件服务等
LDAP的基本模型
LDAP的信息是以树型结构存储的,在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织 (organization)(o=Acme)或组织单元(organizational units) (ou=People)。
LDAP目录中的信息是按照树型结构组织,具体信息存储在条目(Entry)中。DN(Distinguished Name)是用来引用条目的,其相当于关系数据库表中的关键字(Primary Key);条目信息由一组属性名(Attribute)和属性值(Values)组成,一个Attribute可以有多个Value。
2. LDAP简称对应
- o– organization(组织-公司)
- ou – organization unit(组织单元-部门)
- c - countryName(国家)
- dc - domainComponent(域名) -- 类比命名空间
- sn – suer name(真实名称) -- 用户的真是名称
- cn - common name(常用名称) -- 类比用户的昵称(全名)
3. 目录设计
https://www.cnblogs.com/obpm/archive/2010/08/28/1811065.html
4. Java API
参考文章:https://docs.spring.io/spring-ldap/docs/current/reference/
package com.boy.ldap.driver;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import java.util.Hashtable;
public class OpenLdapTools {
private static final String LDAP_DRIVER = "com.sun.jndi.ldap.LdapCtxFactory";
private static final String LDAP_URL_PREFIX = "ldap://127.0.0.1/";
private static final String LDAP_SECURITY_AUTH_TYPE = "simple";
private static final String ROOT = "dc=maxcrc,dc=com";
private static final String LDAP_SECURITY_PRINCIPAL = "cn=manager,dc=maxcrc,dc=com";
private static final String USERNAME = "manager";
private static final String PASSWORD = "secret";
/**
* create connection
*
* @return
*/
public static DirContext getDirContext() {
Hashtable<String, String> env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, LDAP_DRIVER);
env.put(Context.PROVIDER_URL, LDAP_URL_PREFIX + ROOT);
env.put(Context.SECURITY_AUTHENTICATION, LDAP_SECURITY_AUTH_TYPE);
env.put(Context.SECURITY_PRINCIPAL, LDAP_SECURITY_PRINCIPAL);
env.put(Context.SECURITY_CREDENTIALS, PASSWORD);
DirContext ctx = null;
try {
ctx = new InitialDirContext(env);
System.out.println("ldap authn success.");
return ctx;
} catch (NamingException e) {
System.out.println("ldap authn fail.");
e.printStackTrace();
} catch (Exception ex) {
System.out.println("ldap authn error.");
ex.printStackTrace();
}
return null;
}
/**
* close connection
* @param ctx
*/
private static void close (DirContext ctx) {
if (null != ctx) {
try {
ctx.close();
System.out.println("ldap server connection close!");
System.exit(0);
} catch (NamingException e) {
System.out.println("ldap connection fail.");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
DirContext dirContext = getDirContext();
close(dirContext);
}
}
5. 命令行
5.1 查询
ldapsearch -x -H ldap://localhost -b dc=maxcrc,dc=com -D "cn=manager,dc=maxrcr,dc=com" -w secret