Java и LDAP
От: gorbachev  
Дата: 22.10.09 17:29
Оценка:
Мне надо ограничить доступ к проге на основе LDAP (Сверять введенный логин и пароль с тем что есть в LDAP.)
Как это сделать по проще.
Какие есть компоненты в java для работы с LDAP
Re: Java и LDAP
От: C0s Россия  
Дата: 22.10.09 17:56
Оценка:
Здравствуйте, gorbachev, Вы писали:

G>Как это сделать по проще.


предлагаю тебе оттолкнуться от такого примера:

import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.InitialDirContext;

  private static final String LDAP_SERVER_URL =  "ldap://your.ldap.ip";
  private static final String LDAP_DOMAIN = "yourldapdomain";

  private boolean authenticatedByLDAP(final String userName, final String userPassword) {
    try {
       final Properties env = new Properties();
       env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
       env.put(Context.PROVIDER_URL, LDAP_SERVER_URL);
       final String loginName = LDAP_DOMAIN + '\\' + userName;
       env.put(Context.SECURITY_PRINCIPAL, loginName);
       env.put(Context.SECURITY_CREDENTIALS, userPassword);
       new InitialDirContext(env);
       return true;
    }
    catch (Exception ex) {
      log.error("Login failed: " + userName + ": " + ex.getMessage(), ex);
      return false;
    } 
  }
Re[2]: Java и LDAP
От: gorbachev  
Дата: 22.10.09 18:08
Оценка:
Здравствуйте, C0s, Вы писали:

loginName Это у нас кто?
Re[3]: Java и LDAP
От: C0s Россия  
Дата: 22.10.09 18:11
Оценка:
Здравствуйте, gorbachev, Вы писали:

G>loginName Это у нас кто?


полное имя логинящегося пользователя. в примере формируется на основе фиксированного имени домена + того имени, которое ввёл пользователь.
как вариант, возможно, что твои пользователи будут вводить полное имя...
Re[2]: Java и LDAP
От: gorbachev  
Дата: 23.10.09 10:19
Оценка:
Здравствуйте, C0s, Вы писали:

Этот способ с одним серваком LDAP работает нормально а вот с другим нет.
Выдается следующая ошибка.

FailedSASL bind failed: ldap.xasax.com:636javax.naming.CommunicationException: SASL bind failed: ldap.xasax.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]


При поиске нашел вот это http://blogs.sun.com/andreas/entry/no_more_unable_to_find.
С помощью приведенной там программы получил сертификат.

Потом попытался вот так его подгрузить в проге.
System.setProperty("javax.net.ssl.trustStore", "conf/jssecacerts");
 System.setProperty("javax.net.ssl.trustStorePassword", "changeit");


Но ошибка все равно осталась.
Как от нее можно избавиться?
Re[3]: Java и LDAP
От: dotidot Россия  
Дата: 25.10.09 08:54
Оценка:
Здравствуйте, gorbachev, Вы писали:

G>Потом попытался вот так его подгрузить в проге.

G>
G>System.setProperty("javax.net.ssl.trustStore", "conf/jssecacerts");
G> System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
G>

0. указать полный путь к хранилищу сертификатов
1. попробовать делать это в static блоке класса с main
2. попробовать делать это аргументами командной строки при запуске java (у меня работало это только так)
Re[2]: Java и LDAP
От: gorbachev  
Дата: 28.10.09 14:45
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>Здравствуйте, gorbachev, Вы писали:


G>>Как это сделать по проще.


C0s>предлагаю тебе оттолкнуться от такого примера:


C0s>
C0s>import java.util.Properties;
C0s>import javax.naming.Context;
C0s>import javax.naming.NamingException;
C0s>import javax.naming.directory.InitialDirContext;

C0s>  private static final String LDAP_SERVER_URL =  "ldap://your.ldap.ip";
C0s>  private static final String LDAP_DOMAIN = "yourldapdomain";

C0s>  private boolean authenticatedByLDAP(final String userName, final String userPassword) {
C0s>    try {
C0s>       final Properties env = new Properties();
C0s>       env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
C0s>       env.put(Context.PROVIDER_URL, LDAP_SERVER_URL);
C0s>       final String loginName = LDAP_DOMAIN + '\\' + userName;
C0s>       env.put(Context.SECURITY_PRINCIPAL, loginName);
C0s>       env.put(Context.SECURITY_CREDENTIALS, userPassword);
C0s>       new InitialDirContext(env);
C0s>       return true;
C0s>    }
C0s>    catch (Exception ex) {
C0s>      log.error("Login failed: " + userName + ": " + ex.getMessage(), ex);
C0s>      return false;
C0s>    } 
C0s>  }
C0s>


К ldap получается подключиться только с определенным логином и паролем.
Через InitialDirContext.search();
Нахожу пользователя которого надо авторизовать.
Как в такой ситуации проверять пароль если атрибут UserPassword возвращается null?
Re[3]: Java и LDAP
От: dotidot Россия  
Дата: 31.10.09 18:14
Оценка:
Здравствуйте, gorbachev, Вы писали:
G>Нахожу пользователя которого надо авторизовать.
G>Как в такой ситуации проверять пароль если атрибут UserPassword возвращается null?
я работал с ActiveDirectory и сам факт возможности залогинится под заданной парой login/password считал за авторизацию. Ну SID еще у пользователя выдирал и пользуясь интеграцией со сторонней системой проверял. Если говорить про AD, то возможности просто прочитать пароль пользователя насколько помню в ней просто нет. В майкрософтовских тулзах из-за этого даже отдельные диалоги для смены пароля. Хотя я могу ошибатся.
Re: Java и LDAP
От: Аноним  
Дата: 03.11.09 09:24
Оценка:
Здравствуйте, gorbachev, Вы писали:

G>Мне надо ограничить доступ к проге на основе LDAP (Сверять введенный логин и пароль с тем что есть в LDAP.)

G>Как это сделать по проще.
G>Какие есть компоненты в java для работы с LDAP

spring-ldap
Re: Java и LDAP
От: MayB  
Дата: 04.11.09 14:44
Оценка:
Здравствуйте, gorbachev, Вы писали:

G>Мне надо ограничить доступ к проге на основе LDAP (Сверять введенный логин и пароль с тем что есть в LDAP.)

G>Как это сделать по проще.
G>Какие есть компоненты в java для работы с LDAP

Мы на работе юзаем spring-ldap. http://www.springsource.org/ldap — никакого гемора
Re[3]: Java и LDAP
От: Protey Россия  
Дата: 05.11.09 06:07
Оценка:
Здравствуйте, gorbachev, Вы писали:

G>Здравствуйте, C0s, Вы писали:


G>Этот способ с одним серваком LDAP работает нормально а вот с другим нет.

G>Выдается следующая ошибка.

G>
G>FailedSASL bind failed: ldap.xasax.com:636javax.naming.CommunicationException: SASL bind failed: ldap.xasax.com:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
G>


Надо OpenSSL стукнуться на порт LDAP , далее сертификат методом copy/paste с экрана копирнуть в файл, типа server.crt.
keytool -import -alias ldapserver -keyalg RSA -keystore mytruststore -storetype JKS -file server.crt

И помните — ДВА SSL контекста дефолтно не заработают. Т.е. если вы _перед_ обращением и выставлением truststore уже сползали куда по SSL, то рабтать не будет. В связи с этим предлагаю сертификаты импортить в дефолтный файл для JDK/JRE — %JDK%/%JRE%/lib/security/cacerts.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.