https://github.com/daggerok/spring-data-ldap-example
Play with LDAP in Docker using Spring java APIs...
https://github.com/daggerok/spring-data-ldap-example
docker docker-ldap ldap spring-boot-starter-data-ldap spring-data-ldap spring-ldap
Last synced: 18 days ago
JSON representation
Play with LDAP in Docker using Spring java APIs...
- Host: GitHub
- URL: https://github.com/daggerok/spring-data-ldap-example
- Owner: daggerok
- Created: 2020-04-24T13:26:37.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-04-24T14:05:04.000Z (about 6 years ago)
- Last Synced: 2025-07-12T01:32:07.619Z (11 months ago)
- Topics: docker, docker-ldap, ldap, spring-boot-starter-data-ldap, spring-data-ldap, spring-ldap
- Language: Java
- Size: 57.6 KB
- Stars: 2
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Spring + LDAP [](https://github.com/daggerok/spring-data-ldap-example/actions?query=workflow%3ACI)
Play with LDAP in Docker using Spring java APIs...
## LDAP basics (docker)
defaults
```bash
# run LDAP server (dy default: Example Inc. with example.org domain):
docker run -p 389:389 -p 636:636 --rm -it --name ldap osixia/openldap:1.3.0
# exec LDAP query:
docker exec ldap ldapsearch -x -H ldap://localhost:389 -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w admin
```
customize
```bash
docker run -p 389:389 -p 636:636 --rm -it --name ldap \
--env LDAP_ORGANISATION="My Test Company Inc." \
--env LDAP_DOMAIN="my-test-company-domain.com" \
osixia/openldap:1.3.0
# exec query
docker exec ldap ldapsearch -x -H ldap://localhost:389 -b dc=my-test-company-domain,dc=com -D "cn=admin,dc=my-test-company-domain,dc=com" -w admin
```
## step: 0
let's prepare _LDAP_ in _Docker_ by using [osixia](https://github.com/osixia/docker-openldap/) solution.
create `step-0-hello-ldap/ldap/Dockerfile` file:
```Dockerfile
FROM osixia/openldap-backup:1.3.0
LABEL MAINTAINER="Maksim Kostromin https://githuib.com/daggerok/spring-data-ldap-example"
ENTRYPOINT ["/bin/bash"]
CMD ["-c", "/container/tool/run --copy-service -l debug"]
COPY --chown=openldap:openldap ./test-data.ldif /container/service/slapd/assets/config/bootstrap/ldif/50-test-data.ldif
```
create `step-0-hello-ldap/ldap/test-data.ldif` file:
```
version: 1
# Entry: uid=user,dc=my-test-company-domain,dc=com
# user: uid=user,dc=my-test-company-domain,dc=com
# password: password
dn: uid=user,dc=my-test-company-domain,dc=com
uid: user
cn: user
sn: 3
description: My Test Company LDAP user organization account
objectclass: top
objectClass: inetOrgPerson
mail: user@my-test-company-domain.com
userPassword: password
# Entries already exists / provided by docker container:
# Entry 1: dc=my-test-company-domain,dc=com
# Entry 2: cn=admin,dc=my-test-company-domain,dc=com
# Admin user: cn=admin,dc=my-test-company-domain,dc=com
# Admin password: adm1nZupperUberP@assw0rd!!1111oneoneone
```
create `step-0-hello-ldap/docker-compose.yaml` file:
```yaml
version: '2.1'
networks:
my-test-company-domain.com:
services:
ldap:
hostname: ldap.my-test-company-domain.com
build: ./ldap
environment:
LDAP_ORGANISATION: My Test Company Inc.
LDAP_DOMAIN: my-test-company-domain.com
LDAP_ADMIN_PASSWORD: adm1nZupperUberP@assw0rd!!1111oneoneone
LDAP_BACKUP_CONFIG_CRON_EXP: '* * * * *'
LDAP_BACKUP_DATA_CRON_EXP: '*/15 * * * *'
LDAP_BACKUP_TTL: 7
ports:
- '389:389'
- '636:636'
networks:
my-test-company-domain.com:
aliases:
- ldap
- ldap.my-test-company-domain.com
healthcheck:
test: ( ( test 1 -eq `ss -tulwn | grep '0.0.0.0:389' | wc -l` ) && ( test 1 -eq `ss -tulwn | grep '0.0.0.0:636' | wc -l` ) ) || exit 1
interval: 5s
timeout: 5s
retries: 55
# omit ldap-admin-uiand step-0-hello-ldap definitions...
```
add _dependencies_ in `step-0-hello-ldap/pom.xml` file:
```xml
org.springframework.boot
spring-boot-starter-data-ldap
```
add _configurations_ in `step-0-hello-ldap/src/main/resources/application.properties` file:
```properties
spring.ldap.urls=ldap://${LDAP_HOST:127.0.0.1}:${LDAP_PORT:389}
spring.ldap.username=${LDAP_USER:cn=admin,dc=my-test-company-domain,dc=com}
spring.ldap.password=${LDAP_PASSWORD:adm1nZupperUberP@assw0rd!!1111oneoneone}
spring.ldap.base=dc=my-test-company-domain,dc=com
```
implement _java_ app:
```java
@Log4j2
@RestController
@RequiredArgsConstructor
class LdapResource {
final LdapTemplate ldapTemplate;
@RequestMapping("/")
ResponseEntity> index(@RequestBody(required = false) Optional> request) {
var query = request.map(map -> map.get("query"))
.orElse("objectClass=inetOrgPerson");
if (!query.contains("=")) return ResponseEntity
.badRequest().body(Collections.singletonMap("error", "Invalid query. Use key=value format!"));
String[] kv = query.split("=");
var searchResults = ldapTemplate.search(
LdapQueryBuilder.query().where(kv[0]).is(kv[1]),
(AttributesMapper>) attributes -> {
Iterator extends Attribute> iterator = attributes.getAll().asIterator();
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
.map(String::valueOf)
.collect(Collectors.toList());
}
);
return ResponseEntity.ok()
.body(searchResults.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()));
}
}
```
simplify _testing_ for all boiler-plates with docker-compose:
```bash
./mvnw -f step-0-hello-ldap clean package spring-boot:build-image docker-compose:up
http :8080
http :8080 query=objectClass=top
./mvnw -f step-0-hello-ldap docker-compose:down
```
## resources
* [phpLdapAdmin](https://github.com/osixia/docker-phpLDAPadmin)
* [LDAP Env](https://github.com/osixia/docker-openldap#defaultstartupyaml)
* [LDAP in Docker](https://github.com/osixia/docker-openldap/)
* [Spring LDAP](https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/htmlsingle/#boot-features-ldap)
* [Old Spring LDAP references](https://docs.spring.io/spring-ldap/docs/current/reference/)