Docker安装LDAP并集成Springboot测试LDAP

关于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服务器同步用户了,到此结束了就.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值