关于ldap这里不做介绍
一、Docker安装LDAP
1、安装openldap
docker run \
-d \
-p 389:389 \
-p 636:636 \
-v /usr/local/ldap:/usr/local/ldap \
-v /data/openldap/ldap:/var/lib/ldap \
-v /data/openldap/slapd.d:/etc/ldap/slapd.d \
--env LDAP_ORGANISATION="imysh" \
--env LDAP_DOMAIN="imysh.com" \
--env LDAP_ADMIN_PASSWORD="123456" \
--name openldap \
--hostname openldap-host\
--network bridge \
osixia/openldap
2、安装可视化界面phpldapadmin
docker run \
-p 8080:80 \
--privileged \
--name phpldapadmin \
--env PHPLDAPADMIN_HTTPS=false \
--env PHPLDAPADMIN_LDAP_HOSTS=192.168.0.109 \
--detach osixia/phpldapadmin
docker查看容器状态:
3、访问管理首页
访问: 主机ip:8080
4、登录
点击login,输入用户名密码
注意用户名的格式: cn=admin,dc=imysh,dc=com
也就是第一步中安装openladp的配置部分,默认cn就是admin
二、Springboot集成LDAP
1、集成
新建Springboot项目,这是依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
这是配置文件
server:
port: 8089
servlet:
context-path: /
spring:
application:
name: zmy-ldap
# ldap配置
ldap:
urls: ldap://192.168.0.109:389
base: dc=imysh,dc=com
username: cn=admin,${spring.ldap.base}
password: 123456
2、添加测试数据
通过管理页面可以看到目前还没有数据,需要手动添加一些数据,
添加数据可以通过管理页面的import按钮添加,name需要添加哪些数据呢?
添加两个组织
dn: ou=people,dc=imysh,dc=com
objectClass: top
objectClass: organizationalUnit
ou: people
这里我添加了两个组织,一个ou=people,一个ou=yana
3、编写测试代码
①、Person类
package com.imysh.zmy.ldap.entity;
import lombok.Data;
import org.springframework.ldap.odm.annotations.Attribute;
import org.springframework.ldap.odm.annotations.DnAttribute;
import org.springframework.ldap.odm.annotations.Entry;
import org.springframework.ldap.odm.annotations.Id;
import javax.naming.Name;
import java.io.Serializable;
/**
* @author zhangmy
* @date 2022/2/24 9:27
* @description ldap用户
*
* 注解@Entry中base指定了组织(ou=people),如果不指定base,则会在域下面直接生效;objectClasses表情是添加person
*/
@Data
@Entry(base = "ou=people", objectClasses="inetOrgPerson")
public class Person implements Serializable {
private static final long serialVersionUID = -337113594734127702L;
/**
* 此字段不能少
*/
@Id
private Name id;
@DnAttribute(value = "uid", index = 3)
private String uid;
@Attribute(name = "cn")
private String commonName;
@Attribute(name = "sn")
private String suerName;
private String userPassword;
}
然后我们使用SpringbootTest进行测试,需要用到LdapTemplate
@Autowired
private LdapTemplate ldapTemplate;
②、添加用户到people组
/**
* 添加person(注意Person类的定义)
*/
@Test
public void addPerson() {
Person person = new Person();
person.setUid("uid:14");
person.setSuerName("LISI");
person.setCommonName("lisi");
person.setUserPassword("123456");
ldapTemplate.create(person);
}
页面上刷新即可看到
同样的方式给yanfa组也添加一个用户,记得修改Person类的@Entry注解
如果这里添加失败的话,使用maven clean install一下
然后看下添加的数据
③、数据查询
/**
* filter方式查询
*/
@Test
public void filterSearch() {
// 获取域列表,如果要获取确定的某一个域,filter可以这样写: (&(objectclass=dcObject)&(dc=imysh))
// String filter = "(&(objectclass=dcObject))";
// 获取组织列表,如果要获取确定的某一个组织,filter可以这样写: (&(objectclass=organizationalUnit)&(ou=people)
// String filter = "(&(objectclass=organizationalUnit))";
// 获取people列表,如果要获取某一个确定的人,filter可以这样写: (&(objectclass=inetOrgPerson)&(uid=uid:13))
String filter = "(&(objectclass=inetOrgPerson))";
List<Person> list = ldapTemplate.search("", filter, new AttributesMapper() {
@Override
public Object mapFromAttributes(Attributes attributes) throws NamingException {
//如果不知道ldap中有哪些属性,可以使用下面这种方式打印
NamingEnumeration<? extends Attribute> att = attributes.getAll();
while (att.hasMore()) {
Attribute a = att.next();
System.out.println(a.getID() + "=" + a.get());
}
Person p = new Person();
Attribute a = attributes.get("cn");
if (a != null) p.setCommonName((String) a.get());
a = attributes.get("uid");
if (a != null) p.setUid((String) a.get());
a = attributes.get("sn");
if (a != null) p.setSuerName((String) a.get());
a = attributes.get("userPassword");
if (a != null) p.setUserPassword(a.get().toString());
return p;
}
});
list.stream().forEach(System.out::println);
}
/**
* query方式查询
*/
@Test
public void querySearch() {
// 也可以使用filter查询方式,filter 为(&(objectClass=user)(!(objectClass=computer))
List<Person> personList = ldapTemplate.search(query()
.where("objectClass").is("inetOrgPerson")
.and("uid").is("uid:13"),
new AttributesMapper() {
@Override
public Person mapFromAttributes(Attributes attributes) throws NamingException {
//如果不知道ldap中有哪些属性,可以使用下面这种方式打印
// NamingEnumeration<? extends Attribute> att = attr.getAll();
//while (att.hasMore()) {
// Attribute a = att.next();
// System.out.println(a.getID());
//}
Person p = new Person();
Attribute a = attributes.get("cn");
if (a != null) p.setCommonName((String) a.get());
a = attributes.get("uid");
if (a != null) p.setUid((String) a.get());
a = attributes.get("sn");
if (a != null) p.setSuerName((String) a.get());
a = attributes.get("userPassword");
if (a != null) p.setUserPassword(a.get().toString());
return p;
}
});
personList.stream().forEach(System.out::println);
}
两种查询方式都可以
基于这种查询的方式,之后就可以通过这种方式去LDAP服务器同步用户了,到此结束了就.