文章目录
1.介绍
1.1 简介
可以通过以下三句话快速的认识一下LDAP:
LDAP:Lightweight Directory Access Protocol,轻量目录访问协议。
LDAP服务是一个为只读(查询、浏览、搜索)访问而优化的非关系型数据库,呈树状结构组织数据。
LDAP主要用做用户信息查询(如邮箱、电话等)或对各种服务访问做后台认证以及用户数据权限管控。
通常,在实际工作环境中,都会通过LDAP来构建一个统一的账号管理、身份验证平台,实现SSO单点登录机制。
名词解释
DC:domain component一般为公司名,例如:dc=163,dc=com
OU:organization unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文
CN:common name为用户名或者服务器名,最长可以到80个字符,可以为中文
DN:distinguished name为一条LDAP记录项的名字,有唯一性,例如:dc:“cn=admin,ou=developer,dc=163,dc=com”
参考
搞懂OpenLDAP
ldap的详细介绍,搭建,配置管理,备份,案例
1.2 配置
slapd.conf
# 1.schema文件引入
ucdata-path ./ucdata
include ./schema/core.schema
include ./schema/cosine.schema
include ./schema/nis.schema
include ./schema/inetorgperson.schema
include ./schema/openldap.schema
include ./schema/dyngroup.schema
pidfile ./run/slapd.pid
argsfile ./run/slapd.args
# 2.SSL连接配置(证书)
TLSVerifyClient never
TLSCipherSuite HIGH:MEDIUM:-SSLv2
TLSCertificateFile ./secure/certs/server.pem
TLSCertificateKeyFile ./secure/certs/server.pem
TLSCACertificateFile ./secure/certs/server.pem
# 3.指定数据库
database bdb
# 4.配置根目录和超级用户
suffix "dc=abcd,dc=com"
rootdn "cn=Manager,dc=abcd,dc=com"
rootpw {SSHA}moihaDAL4+sNm2+wYyL2wxYq00MMQh+n
# 5.数据存放目录(这里存放到当前文件的data目录中)
directory ./data
# 6.配置相关索引
dirtyread
searchstack 20
# Indices to maintain
index mail pres,eq
index objectclass pres
index default eq,sub
index sn eq,sub,subinitial
index telephonenumber
index cn
# 7.下面可以增加同步数据配置..
openldap slapd.conf参数
slapd.conf 配置文件
LDAP Schema
ldif文件
通过定义LDIF 文件添加用户和用户组信息,然后通过ldapdd 进行添加
ldif的数据结构及一个DEMO
关于ldif文件的创建格式和规范
SSL证书pem
1.证书必须放到服务器,ldap服务器然后再在配置文件里关联,才能进行SSL连接
1.3 数据同步
1.3.1 模式
客户端主动
服务器端主动
2.下载安装
2.1 windows
2.1.1 下载地址
2.1.2 安装
输入services.msc ,打开服务器,找到服务器,看看是否正常启动
2.1.3 加载数据
data.ldif
dn: dc=abcd,dc=com
objectClass: domain
dn: ou=members,dc=abcd,dc=com
ou: members
objectClass: organizationalUnit
dn: cn=user1,ou=members,dc=abcd,dc=com
cn: user1
sn: USER1
uid: user1
userPassword: user1
objectClass: inetOrgPerson
dn: cn=user2,ou=members,dc=abcd,dc=com
cn: user2
sn: USER2
uid: user2
userPassword: user2
objectClass: inetOrgPerson
dn: cn=user3,ou=members,dc=abcd,dc=com
cn: user3
sn: USER3
uid: user3
userPassword: user3
objectClass: inetOrgPerson
1.把data.ldif文件放到ldap安装目录下,如图
2.修改ldap配置文件slapd.conf
3.关闭ldap服务,因为使用服务器端的命令(exe),都要先关闭掉服务才能执行
4.关闭掉服务器后,进入服务器目录,执行相关脚本,如图:
slapadd -v -l data.ldif
2.1.4 工具查看
1.启动ldap服务
2.使用工具连接,如图:
或者
2.2 linux
3 windows使用
3.1
4 linux
5 java连接
5.1 查询
public LdapContext connetLDAP() throws NamingException {
// 连接Ldap需要的信息
String ldapFactory = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapUrl = "ldap://192.168.0.101:389";// url
String ldapAccount = "cn=Manager,dc=abcd,dc=com"; // 用户名
String ldapPwd = "secret";//密码
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, ldapFactory);
// LDAP server
env.put(Context.PROVIDER_URL, ldapUrl);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, ldapAccount);
env.put(Context.SECURITY_CREDENTIALS, ldapPwd);
env.put("java.naming.referral", "follow");
LdapContext ctxTDS = new InitialLdapContext(env, null);
if (ctxTDS != null) {
System.out.println("连接成功!!!");
}
return ctxTDS;
}
//查询
@Test
public void testSearch() throws Exception {
LdapContext ctx = connetLDAP();
// 设置过滤条件
String uid = "user1";
String filter = "(&(objectClass=*)(objectClass=inetOrgPerson)(uid=" + uid + "))";
// 限制要查询的字段内容
String[] attrPersonArray = { "dn", "cn", "uid", "cn", "userPassword", "objectClass" };
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// 设置将被返回的Attribute
searchControls.setReturningAttributes(attrPersonArray);
// 三个参数分别为:
// 上下文;
// 要搜索的属性,如果为空或 null,则返回目标上下文中的所有对象;
// 控制搜索的搜索控件,如果为 null,则使用默认的搜索控件
NamingEnumeration<SearchResult> answer = ctx.search("cn=user1,ou=members,dc=abcd,dc=com", filter.toString(), searchControls);
// 输出查到的数据
while (answer.hasMore()) {
SearchResult result = answer.next();
NamingEnumeration<? extends Attribute> attrs = result.getAttributes().getAll();
while (attrs.hasMore()) {
Attribute attr = attrs.next();
System.out.println(attr.getID() + "=" + attr.get());
}
System.out.println("============");
}
}
5.2 添加
@Test
public void testAdd() throws Exception {
LdapContext ctx = connetLDAP();
Attributes attrs = new BasicAttributes(true);
Attribute objclass = new BasicAttribute("objectClass");
// 添加ObjectClass
String[] attrObjectClassPerson = { "inetOrgPerson"};
Arrays.sort(attrObjectClassPerson);
for (String ocp : attrObjectClassPerson) {
objclass.add(ocp);
}
attrs.put(objclass);
String uid = "katezy";
String userDN = "cn="+uid+",ou=members,dc=abcd,dc=com";
// 密码处理
attrs.put("uid", uid);
attrs.put("cn", uid);
attrs.put("sn", uid);
attrs.put("userPassword", uid.getBytes("UTF-8"));
ctx.createSubcontext(userDN, attrs);
}
5.3 删除
@Test
public void testRemove() throws Exception {
LdapContext ctx = connetLDAP();
String uid = "katezy";
String userDN = "cn="+uid+",ou=members,dc=abcd,dc=com";
ctx.destroySubcontext(userDN);
System.out.println("删除成功");
}
参考:
Java命名目录接口(JNDI)教程–LDAP用户的高级主题
ldap的filter语法
JAVA_基本LDAP操作实例
Java LDAP操作
Spring LDAP的使用
spring-ldap官方文档学习
LDAP查询运算符
基本 LDAP 语法
使用Spring的LdapTemplate进行LDAP操作