public static void main(String[] args)
{
String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
String MY_HOST = "ldap://Localhost:1389";
String MGR_DN = "cn=John,ou=Users,o=IT,dc=QuizPortal";
String MGR_PW = "password";
//Identify service provider to use
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
env.put(Context.PROVIDER_URL, MY_HOST);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, MGR_DN);
env.put(Context.SECURITY_CREDENTIALS, MGR_PW);
try
{
// Create the initial directory context
InitialDirContext initialContext = new InitialDirContext(env);
System.out.println("Context Sucessfully Initialized");
}
catch(Exception e)
{
System.err.println(e);
}
}
Я хотел бы спросить, когда я устанавливаю MGR_DN = "cn = John, ou = Users, o = IT, dc = QuizPortal "
- MGR_DN =" uid = 103, ou = Пользователи, o = IT, dc = QuizPortal "
. В основном, переходя от cn к uid, я столкнулся бы с ошибкой
javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials]
. Я проходил аутентификацию, когда указан как cn = John
, но не uid = 103
. Разве мне не разрешено указывать с помощью uid?
Вы должны указать DN или отличительное имя. Это имя, под которым пользователь связан в каталоге. Вы не можете просто выбрать любую цепочку атрибутов. Если ваши пользователи связаны через атрибут 'cn', то только атрибут 'cn' является частью DN.
Если вы заранее не знаете точный DN, вам следует сначала выполнить поиск в каталоге LDAP. Это можно сделать примерно так (убедитесь, что вы уловили соответствующие исключения):
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapServerUrl);
env.put(Context.SECURITY_AUTHENTICATION, "none");
SearchControls searchCtrls = new SearchControls();
searchCtrls.setReturningAttributes(new String[] {});
searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String filter = "(&(cn=" + identifier + "))";
DirContext ctx = null;
ctx = new InitialDirContext(env);
NamingEnumeration<SearchResult> answer = ctx.search(
ldapBaseDN, filter, searchCtrls);
String fullDN = null;
if (answer.hasMore()) {
fullDN = answer.next().getNameInNamespace();
ctx.close();
ctx = null;
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, fullDN);
env.put(Context.SECURITY_CREDENTIALS, password);
ctx = new InitialDirContext(env);
return true;
}
// Exception otherwise ...
Здесь фильтр поиска "(& (cn =" + identifier + "))"
(так , например (& (cn = John))
), но вместо этого вы можете использовать uid
. Уникальность результатов зависит от конфигурации сервера LDAP. Базовое DN также зависит от способа его настройки (в вашем примере это может быть ou = Users, o = IT, dc = QuizPortal
).
Похоже на проблему конфигурации сервера. Вот похожая проблема, включая решение. В основном вам нужно указать, использовать ли uid
или cn
для аутентификации в ldap-authentication.properties
.