Pro propojení je nutné zadat do properties souboru propojovací údaje (provádí správce aplikace/serveru).
ldap.host=ldap.example.net
ldap.port=636
ldap.use-ssl=true
ldap.bind-dn=<servisni ucet>
ldap.bind-password=<servisni heslo>
ldap.base-dn=OU=Domain Users,DC=example,DC=net
Aplikace Factorify umožňujě ověřovat přihlášení zaměstnance proti LDAP serveru (např. Microsoft Active Directory). Aplikace, pokud je LDAP zapnuto v properties a alespoň jednou použito pravidlo přihlášení LDAP nebo LDAP+MFA), zkusí ověřit přihlašovací údaje (jméno+heslo) proti LDAP serveru. Pokud selže, zkusí se klasické přihlášení jménem/heslem ověřením v aplikaci.
Pro ověření LDAP se používá atribut userPrincipalName (mělo by být standardně v e-mail formátu user@domena).
Pro zapnutí synchronizace uživatelů/zaměstnanců s LDAP serverem je třeba v properties souboru nastavit
ldap.synchronizeEmployee=true
Pak se při založení/úpravě zaměstnance provede založení/úprava záznamu v LDAP serveru. Synchronizované atributy jsou uživatelsky nastavitelné a provádí se v globálních parametrech - skript vrací mapu atributů pro synchronizaci.
Minimální nutné atributy jsou objectClass, DN, CN, SN (další dle nastavení LDAP serveru). Aplikace sama nastavuje vyžadovaný synchronizační atribut employeeNumber (ID zaměstnance) a nastavuje userAccountControl na 514 - DISABLED (při vytváření záznamu).
V rámci AD/LDAP se pak dle firemní politiky účet aktivuje, vytváří userPrincipalName a heslo.
Pokud propojujete aplikaci s existujícími záznamy v LDAP, je nutné před spuštěním synchronizace propárovat zaměstnance ve Factorify nastavením atributu employeeNumber v LDAP!
employeeNumber == employee.id
Zde je příklad skriptu generující mapu atributů.
const baseDn = "OU=Domain Users,DC=example,DC=net";
function generateUserDN(let person) {
var faUnit = person.getFreeAttributes().getValue("UNIT");
var ou;
if (faUnit == "DEVELOPMENT") {
ou = "Development";
} else if (faUnit == "MANUFACTURING") {
ou = "Manufacturing";
} else {
ou = "Other";
}
return "CN=" + person.getFirstname() + " " + person.getLastname() + ",OU=" + ou + "," + baseDn;
}
function putToMap(let map, let key, let value) {
if (isNotBlank(value)) {
map.put(key, value);
}
}
var map = {:};
map.put("objectClass", ["top", "person", "organizationalPerson", "user"]);
putToMap(map, "dn", generateUserDN(entity));
putToMap(map, "cn", entity.getFirstname() + " " + entity.getLastname());
putToMap(map, "sn", entity.getLastname());
putToMap(map, "givenName", entity.getFirstname());
putToMap(map, "displayName", entity.getFullName());
putToMap(map, "c", "CZ");
putToMap(map, "co", "Czech Republic");
var email = entity.findWorkEmail();
putToMap(map, "mail", email);
var phone = entity.getContacts().stream()
.filter(c -> c.type == "WORK_PHONE")
.map(c -> c.value)
.findAny().orElse(null);
putToMap(map, "mobile", phone);
var department = entity.getFreeAttributes().getValue("DEPARTMENT");
putToMap(map, "department", getEnumLabel("DEPARTMENTS_V2", department));
var company = entity.getFreeAttributes().getValue("COMPANY");
putToMap(map, "company", getEnumLabel("COMPANIES", company));
if (!entity.getRoles().isEmpty()) {
putToMap(map, "title", entity.getRoles().get(0).getName().defaultLanguage());
}
if (!entity.getSuperiorRoles().isEmpty()) {
var superiors = hr.findPeopleByRoles(entity.getSuperiorRoles());
if (!superiors.isEmpty()) {
putToMap(map, "manager", generateUserDN(superiors.get(0)));
}
}
return map;