Мое требование состоит в том, что на основе идентификатора пользователя мне нужно получить данные пользователя (например, имя и фамилию) из активного каталога LDAP. Но загвоздка здесь в том, что мы не знаем, в каком домене будет существовать пользователь. И у нас есть около 12 разных доменов, каждый из которых имеет разные URL-адреса провайдера. В настоящее время я могу получить данные о пользователе из одного домена, если я ввожу - 1. providerURL (это зависит от домена, каждый домен имеет свой URL) 2. имя пользователя 3. пароль
Поскольку проблема в том, что мы не знаем, в каком домене будет существовать пользователь, я не хочу делать последовательные или параллельные вызовы для поиска пользователя по одному в каждом домене. Есть ли другой способ, чтобы за один вызов я мог искать конкретного пользователя во всех доступных доменах? ищу любое простое решение на основе Java или Spring-Java.
Мы слышали, что в активном каталоге LDAP есть глобальный журнал Catlog, но мало о нем знали. Возможно ли, что если мы создадим некоторую глобальную учетную запись (которая будет действовать как суперпользователь), тогда, используя данные этой глобальной учетной записи, мы сможем искать конкретного пользователя во всех доменах.
Я не знаю о структуре сервера Active Directory LDAP, могу ли я иметь учетную запись службы (со специальными разрешениями на доступ к ролям), чтобы с ее помощью я мог искать сведения о пользователях во всех доменах.
Другой запрос -> вместо глобальной учетной записи службы. Если мы создадим учетную запись службы в одном домене с некоторыми дополнительными разрешениями на доступ к специальным ролям, могу ли я использовать ее для поиска пользователя из любых других доменов?
Пожалуйста, предложите подход к решению для требований нашего проекта.
В настоящее время я могу получить данные пользователя из одного домена, используя его, используя приведенный ниже код->
public class LDAPExaminer {
public static void main(String[] args) {
LDAPExaminer ldapExaminer = new LDAPExaminer();
ldapExaminer.printUserBasicAttributes("userId", ldapExaminer.getLdapContext());
}
public LdapContext getLdapContext() {
LdapContext ctx = null;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_AUTHENTICATION, "Simple");
env.put(Context.SECURITY_PRINCIPAL, "user@domain");
env.put(Context.SECURITY_CREDENTIALS, "password");
env.put(Context.PROVIDER_URL, "ldap://example.domain.com");
env.put(Context.REFERRAL, "follow");
System.out.println("Attempting to Connect...");
ctx = new InitialLdapContext(env, null);
System.out.println("Connection Successful.");
} catch (NamingException nex) {
System.out.println("LDAP Connection: FAILED");
nex.printStackTrace();
}
return ctx;
}
private void printUserBasicAttributes(String username, LdapContext ctx) {
try {
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
String[] attrIDs = {"distinguishedName", "UN", "givenname", "mail", "telephonenumber", "canonicalName", "userAccountControl", "accountExpires"};
constraints.setReturningAttributes(attrIDs);
NamingEnumeration answer = ctx.search("DC=example,DC=domain,DC=com", "sAMAccountName=" + username, constraints);
if (answer.hasMore()) {
Attributes attrs = ((SearchResult) answer.next()).getAttributes();
System.out.println(attrs.get("distinguishedName"));
System.out.println(attrs.get("givenname"));
System.out.println(attrs.get("sn"));
System.out.println(attrs.get("mail"));
System.out.println(attrs.get("telephonenumber"));
System.out.println(attrs.get("canonicalName"));
System.out.println(attrs.get("userAccountControl"));
System.out.println(attrs.get("accountExpires"));
} else {
throw new Exception("Invalid User");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}