Merge branch 'DEVELOP' of ssh://git.eclipse.org:29418/openk-usermodules/org.eclipse.openk-usermodules.contactBaseData.backend into KON-43-Synchronisation-Interne-Personen-mit-LDAP
diff --git a/pom.xml b/pom.xml
index ea368ff..ed6c3d9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,6 +69,10 @@
 		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-ldap</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-oauth2-client</artifactId>
 		</dependency>
 		<dependency>
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/api/AuthNAuthApi.java b/src/main/java/org/eclipse/openk/contactbasedata/api/AuthNAuthApi.java
index 76e7799..ca7355c 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/api/AuthNAuthApi.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/api/AuthNAuthApi.java
@@ -14,6 +14,7 @@
 */
 package org.eclipse.openk.contactbasedata.api;
 
+import org.eclipse.openk.contactbasedata.model.KeyCloakUser;
 import org.eclipse.openk.contactbasedata.viewmodel.UserModule;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,4 +33,7 @@
 
     @GetMapping(value= "/portal/rest/beservice/userModulesForUser")
     List<UserModule> getUserModulesForUser(@RequestHeader("Authorization") String token );
+
+    @GetMapping(value= "/portal/rest/beservice/users")
+    List<KeyCloakUser> getKeycloakUsers(@RequestHeader("Authorization") String token );
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java
new file mode 100644
index 0000000..a0f91e2
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/LdapController.java
@@ -0,0 +1,58 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+ */
+package org.eclipse.openk.contactbasedata.controller;
+
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.service.LdapUserService;
+import org.eclipse.openk.contactbasedata.viewmodel.LdapUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+@Log4j2
+@RestController
+@RequestMapping("/ldap")
+public class LdapController {
+
+    @Autowired
+    private LdapUserService ldapUserService;
+
+    @ApiOperation(value = "Ermitteln der UserModules vom Auth'n'Auth-Service")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @ResponseStatus(HttpStatus.OK)
+    @GetMapping( "/users")
+    public List<LdapUser> getLdapUser() {
+        return ldapUserService.getAllLdapUsers();
+    }
+
+    @ApiOperation(value = "Ermitteln der UserModules vom Auth'n'Auth-Service")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @ResponseStatus(HttpStatus.OK)
+    @GetMapping( "/sync")
+    public String syncLdapUser() {
+        ldapUserService.synchronize();
+        return  "";
+    }
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/controller/UserModuleController.java b/src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java
similarity index 69%
rename from src/main/java/org/eclipse/openk/contactbasedata/controller/UserModuleController.java
rename to src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java
index eced874..0ba1a58 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/controller/UserModuleController.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/controller/UserController.java
@@ -18,7 +18,8 @@
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import lombok.extern.log4j.Log4j2;
-import org.eclipse.openk.contactbasedata.service.UserModuleService;
+import org.eclipse.openk.contactbasedata.model.KeyCloakUser;
+import org.eclipse.openk.contactbasedata.service.UserService;
 import org.eclipse.openk.contactbasedata.viewmodel.UserModule;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -29,19 +30,25 @@
 
 @Log4j2
 @RestController
-@RequestMapping("/user-modules")
-public class UserModuleController {
+@RequestMapping("/user")
+public class UserController {
 
     @Autowired
-    private UserModuleService userModuleService;
+    private UserService userService;
 
     @ApiOperation(value = "Ermitteln der UserModules vom Auth'n'Auth-Service")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
-    @GetMapping
+    @GetMapping("/modules")
     public List<UserModule> getUserModules() {
-        return userModuleService.getUserModules();
+        return userService.getUserModules();
     }
 
+    @ApiOperation(value = "Ermitteln der der KeycloakUsers vom Auth'n'Auth-Service")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "Erfolgreich durchgeführt")})
+    @GetMapping("/keycloak-users")
+    public List<KeyCloakUser> getKeycloakUsers() {
+        return userService.getKeycloakUsers();
+    }
 
 
 
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java b/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java
new file mode 100644
index 0000000..d1277c1
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/model/KeyCloakUser.java
@@ -0,0 +1,97 @@
+/**
+******************************************************************************
+* Copyright © 2017-2018 PTA GmbH.
+* All rights reserved. This program and the accompanying materials
+* are made available under the terms of the Eclipse Public License v1.0
+* which accompanies this distribution, and is available at
+* 
+*     http://www.eclipse.org/legal/epl-v10.html
+* 
+******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.model;
+
+import java.util.List;
+import java.util.Map;
+
+public class KeyCloakUser {
+    private String id;
+    private long createdTimestamp;
+    private String username;
+    private boolean enabled;
+    private boolean totp;
+    private boolean emailVerified;
+    private String firstName;
+    private String lastName;
+    private String name;
+    private List<String> realmRoles;
+    private Map<String, List<String>> clientRoles;
+
+    private List<String> disableableCredentialTypes;
+    private List<String> requiredActions;
+
+    public String getId() { return id; }
+    public void setId(String id) { this.id = id; }
+
+    public long getCreatedTimestamp() { return createdTimestamp; }
+    public void setCreatedTimestamp(long createdTimestamp) { this.createdTimestamp = createdTimestamp; }
+
+    public String getUsername() { return username; }
+    public void setUsername(String username) { this.username = username; }
+
+    public void setTotp(boolean totp) { this.totp = totp; }
+
+    public void setEmailVerified(boolean emailVerified) { this.emailVerified = emailVerified; }
+
+    public String getFirstName() { return firstName; }
+    public void setFirstName(String firstName) { this.firstName = firstName; }
+
+    public String getLastName() { return lastName; }
+    public void setLastName(String lastName) { this.lastName = lastName; }
+
+    public List<String> getDisableableCredentialTypes() {
+        return disableableCredentialTypes;
+    }
+    public void setDisableableCredentialTypes(List<String> disableableCredentialTypes) { this.disableableCredentialTypes = disableableCredentialTypes; }
+
+    public List<String> getRequiredActions() {
+        return requiredActions;
+    }
+    public void setRequiredActions(List<String> requiredActions) { this.requiredActions = requiredActions; }
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public boolean isTotp() {
+        return totp;
+    }
+
+    public boolean isEmailVerified() {
+        return emailVerified;
+    }
+
+    public List<String> getRealmRoles() {
+        return realmRoles;
+    }
+
+    public void setRealmRoles(List<String> realmRoles) {
+        this.realmRoles = realmRoles;
+    }
+
+    public Map<String, List<String>> getClientRoles() {
+        return clientRoles;
+    }
+
+    public void setClientRoles(Map<String, List<String>> clientRoles) {
+        this.clientRoles = clientRoles;
+    }
+
+    public void setName() {
+        if (lastName!= null && !lastName.isEmpty()){
+            this.name = firstName+ " " + lastName;
+        } else {
+            this.name = firstName;
+        }
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java b/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
index 22348d0..1ea4525 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/repository/InternalPersonRepository.java
@@ -21,6 +21,7 @@
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
 
@@ -37,4 +38,5 @@
 
     Page<TblInternalPerson> findByContact_anonymizedFalseOrContact_anonymizedIsNull(Pageable pageable); // NOSONAR fd 07.02.2020: Method name cannot be changed
 
+    List<TblInternalPerson> findByUidNotNull();
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java
new file mode 100644
index 0000000..d52408d
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapService.java
@@ -0,0 +1,110 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+package org.eclipse.openk.contactbasedata.service;
+
+import org.eclipse.openk.contactbasedata.api.AuthNAuthApi;
+import org.eclipse.openk.contactbasedata.viewmodel.LdapUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.ldap.core.*;
+import org.springframework.ldap.support.LdapNameBuilder;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+
+import javax.naming.Name;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.List;
+
+@Service
+public class LdapService {
+
+    @Autowired
+    InternalPersonService internalPersonService;
+
+    @Autowired
+    private AuthNAuthApi authNAuthApi;
+
+    @Autowired
+    private Environment env;
+
+    @Autowired
+    private ContextSource contextSource;
+
+    @Autowired
+    private LdapTemplate ldapTemplate;
+
+    public void authenticate(final String username, final String password) {
+        contextSource.getContext("cn=" + username + ",ou=users," + env.getRequiredProperty("ldap.partitionSuffix"), password);
+    }
+
+    public List<String> search(final String username) {
+        return ldapTemplate.search(
+                "ou=users",
+                "cn=" + username,
+                (AttributesMapper<String>) attrs -> (String) attrs
+                        .get("cn")
+                        .get());
+    }
+
+    public void create(final String username, final String password) {
+        Name dn = LdapNameBuilder
+                .newInstance()
+                .add("ou", "users")
+                .add("cn", username)
+                .build();
+        DirContextAdapter context = new DirContextAdapter(dn);
+
+        context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" });
+        context.setAttributeValue("cn", username);
+        context.setAttributeValue("sn", username);
+        context.setAttributeValue("userPassword", digestSHA(password));
+
+        ldapTemplate.bind(context);
+    }
+
+    public void modify(final String username, final String password) {
+        Name dn = LdapNameBuilder
+                .newInstance()
+                .add("ou", "users")
+                .add("cn", username)
+                .build();
+        DirContextOperations context = ldapTemplate.lookupContext(dn);
+
+        context.setAttributeValues("objectclass", new String[] { "top", "person", "organizationalPerson", "inetOrgPerson" });
+        context.setAttributeValue("cn", username);
+        context.setAttributeValue("sn", username);
+        context.setAttributeValue("userPassword", digestSHA(password));
+
+        ldapTemplate.modifyAttributes(context);
+    }
+
+    private String digestSHA(final String password) {
+        String base64;
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA");
+            digest.update(password.getBytes());
+            base64 = Base64
+                    .getEncoder()
+                    .encodeToString(digest.digest());
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e);
+        }
+        return "{SHA}" + base64;
+    }
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java
new file mode 100644
index 0000000..424c28a
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/LdapUserService.java
@@ -0,0 +1,82 @@
+package org.eclipse.openk.contactbasedata.service;
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.model.TblInternalPerson;
+import org.eclipse.openk.contactbasedata.repository.InternalPersonRepository;
+import org.eclipse.openk.contactbasedata.service.util.LdapUserAttributesMapper;
+import org.eclipse.openk.contactbasedata.viewmodel.LdapUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ldap.core.LdapTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static org.springframework.ldap.query.LdapQueryBuilder.query;
+
+@Log4j2
+@Service
+public class LdapUserService {
+
+    @Autowired
+    LdapUserAttributesMapper ldapUserAttributesMapper;
+
+    @Autowired
+    private InternalPersonRepository internalPersonRepository;
+
+    @Autowired
+    private InternalPersonService internalPersonService;
+
+    @Autowired
+    private LdapTemplate ldapTemplate;
+
+    /**
+     * Retrieves all the persons in the ldap server, using {@link LdapUserAttributesMapper}
+     * @return list of persons
+     */
+    public List<LdapUser> getAllLdapUsers() {
+        return ldapTemplate.search(query()
+                .where("objectclass").is("person"), ldapUserAttributesMapper);
+    }
+
+    public void synchronize() {
+        List<TblInternalPerson> internalPersonList = internalPersonRepository.findByUidNotNull();
+
+        Map<String, TblInternalPerson> uidToInternalPersonMap = internalPersonList.stream().collect(
+                Collectors.toMap(TblInternalPerson::getUid, Function.identity()));
+
+        List<LdapUser> allLdapUsers = getAllLdapUsers();
+
+        List<TblInternalPerson> internalPersonListSynchronized = new ArrayList<>();
+        for (LdapUser ldapUser : allLdapUsers) {
+            TblInternalPerson tblInternalPerson = uidToInternalPersonMap.get(ldapUser.getUid());
+            if (tblInternalPerson == null) continue;
+            boolean attributesChanged = mapLdapUserToInternaPerson(tblInternalPerson, ldapUser);
+            if (attributesChanged) {
+                internalPersonListSynchronized.add(tblInternalPerson);
+            }
+        }
+
+        internalPersonRepository.saveAll(internalPersonListSynchronized);
+    }
+
+    private boolean mapLdapUserToInternaPerson(TblInternalPerson tblInternalPerson, LdapUser ldapUser) {
+        boolean attributesChanged = false;
+        if (!Objects.equals(tblInternalPerson.getFirstName(), ldapUser.getFirstName())
+                || !Objects.equals(tblInternalPerson.getLastName(), ldapUser.getLastName() )
+                || !Objects.equals(tblInternalPerson.getTitle(), ldapUser.getTitle() )
+                || !Objects.equals(tblInternalPerson.getDepartment(), ldapUser.getDepartment())) {
+            attributesChanged = true;
+            tblInternalPerson.setFirstName(ldapUser.getFirstName());
+            tblInternalPerson.setLastName(ldapUser.getLastName());
+            tblInternalPerson.setTitle(ldapUser.getTitle());
+            tblInternalPerson.setDepartment(ldapUser.getDepartment());
+        }
+        return attributesChanged;
+    }
+
+
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/UserModuleService.java b/src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java
similarity index 68%
rename from src/main/java/org/eclipse/openk/contactbasedata/service/UserModuleService.java
rename to src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java
index b0c9dc4..c0d96cb 100644
--- a/src/main/java/org/eclipse/openk/contactbasedata/service/UserModuleService.java
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/UserService.java
@@ -15,20 +15,32 @@
 package org.eclipse.openk.contactbasedata.service;
 
 import org.eclipse.openk.contactbasedata.api.AuthNAuthApi;
+import org.eclipse.openk.contactbasedata.model.KeyCloakUser;
 import org.eclipse.openk.contactbasedata.viewmodel.UserModule;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
 
 @Service
-public class UserModuleService {
+public class UserService {
     @Autowired
     private AuthNAuthApi authNAuthApi;
 
+    @Value("${jwt.staticJwt}")
+    private String staticJwt;
+
     public List<UserModule> getUserModules() {
         String bearerToken = (String)SecurityContextHolder.getContext().getAuthentication().getDetails();
         return authNAuthApi.getUserModulesForUser(bearerToken);
     }
+
+    public List<KeyCloakUser> getKeycloakUsers() {
+        //String bearerToken = (String)SecurityContextHolder.getContext().getAuthentication().getDetails();
+        Object details = SecurityContextHolder.getContext().getAuthentication().getDetails();
+        String bearerToken = staticJwt;
+        return authNAuthApi.getKeycloakUsers(bearerToken);
+    }
 }
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java b/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java
new file mode 100644
index 0000000..2738cc2
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/service/util/LdapUserAttributesMapper.java
@@ -0,0 +1,89 @@
+package org.eclipse.openk.contactbasedata.service.util;
+
+import lombok.extern.log4j.Log4j2;
+import org.eclipse.openk.contactbasedata.viewmodel.LdapUser;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.ldap.core.AttributesMapper;
+import org.springframework.stereotype.Component;
+
+import javax.naming.NamingException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+
+/**
+ * Custom person attributes mapper, maps the attributes to the person POJO
+ */
+@Log4j2
+@Component
+public class LdapUserAttributesMapper implements AttributesMapper {
+
+    /*
+    Config in yaml example (variable : attributeName in LDAP):
+    ----------------------
+    uid: uid
+    fullname: cn
+    lastname: sn
+    firstname: givename
+    title: title
+    mail: mail
+    ----------------------
+    */
+
+    @Value("${ldap.uid}")
+    private String uid;
+
+    @Value("${ldap.fullname}")
+    private String fullname;
+
+    @Value("${ldap.lastname}")
+    private String lastname;
+
+    @Value("${ldap.firstname}")
+    private String firstname;
+
+    @Value("${ldap.title}")
+    private String title;
+
+    @Value("${ldap.mail}")
+    private String mail;
+
+    @Value("${ldap.password}")
+    private String password;
+
+
+    @Override
+    public LdapUser mapFromAttributes(Attributes attributes) throws NamingException {
+        LdapUser ldapUser = new LdapUser();
+
+        Attribute attribute = attributes.get(uid);
+        if (attribute != null) {
+            ldapUser.setUid((String) attribute.get());
+        }
+        attribute = attributes.get(fullname);
+        if (attribute != null) {
+            ldapUser.setFullName((String) attribute.get());
+        }
+        attribute = attributes.get(lastname);
+        if (attribute != null) {
+            ldapUser.setLastName((String) attribute.get());
+        }
+        attribute = attributes.get(firstname);
+        if (attribute != null) {
+            ldapUser.setFirstName((String) attribute.get());
+        }
+        attribute = attributes.get(title);
+        if (attribute != null) {
+            ldapUser.setTitle((String) attribute.get());
+        }
+        attribute = attributes.get(mail);
+        if (attribute != null) {
+            ldapUser.setMail((String) attribute.get());
+        }
+        attribute = attributes.get(password);
+        if (attribute != null) {
+            ldapUser.setPassword((byte[]) attribute.get());
+        }
+
+        return ldapUser;
+    }
+}
diff --git a/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java
new file mode 100644
index 0000000..6b1601b
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/contactbasedata/viewmodel/LdapUser.java
@@ -0,0 +1,110 @@
+package org.eclipse.openk.contactbasedata.viewmodel;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import javax.naming.Name;
+import java.nio.charset.StandardCharsets;
+
+//@Entry(base = "ou=users", objectClasses = { "person", "inetOrgPerson", "top" })
+public class LdapUser {
+
+    @JsonIgnore
+    private Name dn;
+
+    private String uid;
+    private String fullName;
+    private String firstName;
+    private String lastName;
+    private String title;
+    private String department;
+    private String mail;
+    private byte[] password;
+
+    public LdapUser() {
+    }
+
+    public LdapUser(String uid, String password) {
+    }
+
+    public Name getDn() {
+        return dn;
+    }
+
+    public void setDn(Name dn) {
+        this.dn = dn;
+    }
+
+    public String getUid() {
+        return uid;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public String getFullName() {
+        return fullName;
+    }
+
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    public String getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(String department) {
+        this.department = department;
+    }
+
+    public byte[] getPassword() {
+        return password;
+    }
+
+    public void setPassword(byte[] password) {
+        this.password = password;
+    }
+
+    public void setPassword2(String password) {
+        this.password = password.getBytes(StandardCharsets.UTF_8);
+    }
+
+    public String getMail() {
+        return mail;
+    }
+
+    public void setMail(String mail) {
+        this.mail = mail;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    @Override
+    public String toString() {
+        return uid;
+    }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index b1a50e9..774100c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -17,6 +17,21 @@
     password: cbd_service
   flyway:
     enabled: false
+  ldap:
+    base: o=sevenSeas
+    username: uid=admin,ou=system
+    password: secret
+    port: 10389
+    urls: ldap://entopkon:10389
+
+ldap:
+  uid: uid
+  fullname: cn
+  lastname: sn
+  firstname: givenname
+  title: title
+  mail: mail
+  password: userpassword
 
 server:
   max-http-header-size: 262144