Аутентификация на LDAP с текущим пользователем в JNDI/Java
Я думал, что найду больше об этой теме, но я не нашел.
Я должен написать Java-приложение, которое проверяет, частью какого конкретного пользователя является.
Но для аутентификации на сервере я не могу запросить имя пользователя и пароль, а также не могу сохранить его в источнике (или каком-либо другом файле).
Есть ли способ с JNDI и Java для аутентификации пользователя, который в настоящее время вошел в систему?
3 ответа
Поскольку кажется, что нет реального решения этого вопроса, я теперь иду с запросом информации для входа в систему в начале сценария / инструмента и использую ее при необходимости.
Все, что вы можете сделать, это проверить, есть ли какой-либо пользователь с тем же именем пользователя, что и пользователь, который в данный момент вошел в ваше Java-приложение. Вы не сможете проверить что-либо еще без его пароля. Для этого вам понадобятся имя пользователя и пароль пользователя ldap, у которого есть разрешение на перечисление других пользователей. Затем вы можете запросить LDAP для вашего пользователя.
Это пример, адаптированный из чего-то, что я использую, он сравнивает с активным каталогом, поэтому, возможно, потребуются некоторые изменения:
boolean userFound = user_exits("searchUser",
"searchPassword",
"(sAMAccountName={USERNAME})",
"ldap://ldap.mydomain.com",
"OU=MYOU,dc=mydomain,dc=com");
private boolean user_exits(String searchUser, String searchPassword,
String filter, String url, String baseDn) throws NamingException {
DirContext ctx = null;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, searchUser);
env.put(Context.SECURITY_CREDENTIALS, searchPassword);
try {
ctx = new InitialDirContext(env);
String[] attributeFilter = {};
SearchControls sc = new SearchControls();
sc.setReturningAttributes(attributeFilter);
sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> results = ctx.search(baseDn, filter, sc);
return results.hasMore();
} catch (NamingException e) {
throw e;
} finally {
if (ctx != null) {
try {
ctx.close();
} catch (NamingException e) {}
}
}
}
Если у клиента LDAP есть существующее соединение, используйте либо who am i?
расширенный запрос, или authorization identity request control
чтобы определить authID существующего соединения - LDAP-совместимые серверы и UnboundID LDAP SDK будут поддерживать любой из этих методов. who am i?
расширенный запрос может быть использован в любое время в соединении (при условии, что идентификация аутентификации имеет разрешение на использование расширенного запроса), но authorization identity request control
можно прикрепить только к запросу на привязку.
Использование who am i?
расширенный запрос и authorization identity request control
демонстрируются в AuthDemo.java.