Статьи

2 способа настройки аутентификации LDAP Active Directory в учебном примере по безопасности Java Spring

Аутентификация LDAP является одним из самых популярных в мире механизмов аутентификации для корпоративных приложений, а Active Directory (реализация LDAP от Microsoft для Windows) — еще один широко используемый сервер LDAP. Во многих проектах нам необходимо проходить аутентификацию в активном каталоге с использованием LDAP по учетным данным, указанным на экране входа в систему. Иногда эта простая задача усложняется из-за различных проблем, возникающих при реализации и интеграции, и из-за отсутствия стандартного способа аутентификации LDAP . Java обеспечивает поддержку LDAP, но в этой статье я в основном буду говорить о весенней безопасности, потому что это моя любимая среда Java для аутентификации, авторизации и безопасности.

Мы можем сделать то же самое в Java, написав собственную программу для поиска LDAP, а затем связывание LDAP, но, как я сказал, это намного проще и чище, когда вы используете Spring Security для аутентификации LDAP.

Наряду с поддержкой LDAP Spring Security также предоставляет несколько других функций, которые требуются корпоративному Java-приложению, включая SSL-безопасность, шифрование паролей и средства ожидания сеанса.

1. Основы аутентификации LDAP

Прежде чем углубляться в аутентификацию LDAP в Active Directory, давайте познакомимся с некоторыми терминами LDAP, потому что большую часть времени пользователи делают это в первый раз, и они не очень знакомы с типичными глоссариями LDAP, такими как Dn, Ou, Bind или search и т. Д.
Dn — Отличительное имя , уникальное имя, которое используется для поиска пользователя на сервере LDAP, например, Microsoft Active Directory.
Ou — организационная единица
Привязка — LDAP Привязка — это операция, при которой клиенты LDAP отправляют bindRequest пользователю LDAP, включая имя пользователя и пароль, и, если сервер LDAP может найти правильные имя пользователя и пароль, он разрешает доступ к серверу LDAP.
Поиск — поиск LDAP — это операция, которая выполняется для получения Dn пользователя с использованием некоторых учетных данных пользователя.
Root — верхний элемент каталога LDAP, такой как Root of a tree.
BaseDn — ветвь в дереве LDAP, которая может использоваться в качестве базы для операции поиска LDAP, например, dc = Microsoft, dc = org ”

Если вы хотите узнать больше о LDAP, проверьте эту ссылку, там есть подробная информация о LDAP.

2. Аутентификация LDAP в Active Directory Spring Security

Существует два способа реализации аутентификации в активном каталоге с использованием протокола LDAP в Spring Spring. Первый способ — это программный и декларативный способ, который требует некоторого кодирования и некоторой конфигурации.

С другой стороны, второй способ — это готовое решение от ActireDirectoryAuthenticationProvider Security, которое просто требует настройки ActireDirectoryAuthenticationProvider и все готово. мы увидим оба подхода, но я предлагаю использовать второй, потому что он прост и удобен в использовании.

2.1 Аутентификация в Active Directory с использованием LDAP в Spring Security — пример 1

конфигурация
Добавьте следующую конфигурацию в ваш весенний файл application-context.xml, я бы предложил поместить эту конфигурацию в отдельный файл application-context-security.XML вместе с другими элементами, связанными с безопасностью.
1) Настройка сервера LDAP
Чтобы настроить сервер LDAP, поместите следующий фрагмент XML в файл конфигурации безопасности Spring:

1
2
3
4
5
6
<s:ldap-server
  url="ldap://stockmarket.com"   //ldap url
  port="389"                    //ldap port
  manager-dn="[email protected]" //manager username
  manager-password="AD83DgsSe"                 //manager password
/>

Эта конфигурация не требует пояснений, но в двух словах о manager-dn и пароле, аутентификации LDAP в активном каталоге или любом другом каталоге LDAP выполняется в два этапа: сначала выполняется поиск LDAP для поиска Dn (различаемого имени) пользователя и затем этот Dn используется для выполнения привязки LDAP.

Если привязка успешна, то аутентификация пользователя успешна, иначе она завершается неудачно. Некоторые люди предпочитают удаленное сравнение паролей, чем привязку LDAP , но привязка LDAP — это то, что вы в основном заканчиваете.

Большая часть Active Directory не разрешает операцию анонимного поиска, поэтому для выполнения поиска LDAP у вашей службы должна быть учетная запись LDAP, что мы и предоставили здесь manager-manager и manager-password.property.
Таким образом, теперь вход в LDAP будет выполнен с помощью следующих шагов:

  1. Ваша служба или приложение связывают себя с LDAP, используя manager-dn и manager-password.
  2. LDAP поиск для пользователя, чтобы найти UserDn
  3. Связывание LDAP с использованием UserDn

Это завершает часть входа в систему LDAP. Теперь перейдем к следующей части настройки провайдера аутентификации LDAP.
2) Настройка провайдера аутентификации LDAP
В этом разделе указаны различные провайдеры аутентификации в Spring-Security, здесь вы можете увидеть своего провайдера аутентификации LDAP, и мы используем userPrincipalName для поиска пользователей в каталоге Microsoft Active.

1
2
3
4
5
6
7
8
9
<s:authentication-manager erase-credentials="true">
<s:ldap-authentication-provider
   user-search-base="dc=stockmarketindia,dc=trader"
   user-search-filter="userPrincipalName={0}"
/>
 
<s:authentication-provider
  ref="springOutOfBoxActiveDirecotryAuthenticationProvider"/>
</s:authentication-manager>

Теперь для передачи userPrincipalName и аутентификации пользователя требуется небольшой фрагмент кода.

01
02
03
04
05
06
07
08
09
10
public boolean login(String username, String password) {
   AndFilter filter = new AndFilter();
   ldapTemplate.setIgnorePartialResultException(true); // Active
   Directory doesn’t transparently handle referrals. This fixes that.
  
   filter.and(new EqualsFilter("userPrincipalName", username));
   return ldapTemplate.authenticate("dc=stockmarketindia,dc=trader",
             filter.toString(), password);
 
}

Строка 2 очень важна в этой программе, потому что я потратил целый день на выяснение того, когда мое приложение неоднократно генерировало javax.naming.PartialResultException: необработанные ссылки на продолжение. Вы также можете использовать sAMAccountName для пользователя, userPrincipalName поиск, оба userPrincipalName и sAMAccountName уникальны. в Active Directory.

Здесь самое важное то, что это должно быть полное имя, например name @ domain, например [email protected].

Метод authenticate() вернет true или false в зависимости от результата операции связывания.

2.2 Аутентификация Active Directory с использованием LDAP в Spring Security — более простой пример

Второй подход намного проще и понятнее, поскольку он поставляется «из коробки», вам просто нужно настроить URL-адрес и доменное имя сервера LDAP, и он будет работать как кремовый.

01
02
03
04
05
06
07
08
09
10
<s:authentication-manager erase-credentials="true">
   <s:authentication-provider ref="ldapActiveDirectoryAuthProvider"/>
</s:authentication-manager>
 
<bean id="ldapActiveDirectoryAuthProvider"
class="org.springframework.security.ldap.authentication.ad.
                ActiveDirectoryLdapAuthenticationProvider">
  <constructor-arg value="stockmarket.com" />  //your domain
  <constructor-arg value="ldap://stockmarket.com/" />  //ldap url
</bean>

Вот и все, сделано. Эта конфигурация будет аутентифицировать и загружать все предоставленные права доступа из LDAP, например, группу, членом которой вы являетесь. Это также интегрировано с пружинным элементом входа в систему безопасности.

2.3 Зависимость

Этот пример основан на Spring Security 3.0, и я использовал Spring-ldap-1.3.1.RELEASE-all.jar и spring-security-ldap-3.1.0.RC3.jar.

Если вы не знаете, как загрузить JAR-файлы Spring Framework , выполните действия, описанные в этом руководстве по загрузке JAR Spring Framework , в котором объясняется, как загрузить Spring Framework и другие связанные JAR-файлы из Maven Central.

2.4 Ошибки при аутентификации LDAP

Вам очень повезло завершить аутентификацию LDAP по Active Directory без каких-либо ошибок или исключений, здесь я перечисляю некоторые распространенные ошибки, с которыми я столкнулся, и их решения для быстрого ознакомления.
1) javax.naming.PartialResultException: необработанные ссылки на продолжение; оставшееся имя ‘dc = компания, dc = com’
Эта ошибка возникает из-за того, что Microsoft Active Directory не обрабатывает рефералы должным образом, и для исправления этого набора установите это свойство

1
ldapTemplate.setIgnorePartialResultException(true);

2) javax.naming.NameNotFoundException: [LDAP: код ошибки 32 — Нет такого объекта]; оставшееся имя »
Эта ошибка решена с помощью проб и ошибок и, в основном, произошла из-за неверного формата имени пользователя . это решается путем предоставления полного имени, например, [email protected]

2.5 Инструменты

Браузер LDAP : Наличие некоторых инструментов для просмотра данных в каталоге LDAP лучше всего дает некоторую наглядность, а также позволяет просматривать данные в LDAP.

Он называется браузером LDAP, и в Интернете доступно множество браузеров LDAP с открытым исходным кодом, например, jexplorer. Вы можете просматривать и просматривать данные в Active Directory с помощью браузера LDAP.

2.6 Аутентификация в Active Directory LDAP через SSL

Это прекрасно работает для реализации аутентификации LDAP по активному каталогу Microsoft. но одна вещь, на которую вы могли бы обратить внимание, — это когда имя пользователя и пароль LDAP передаются на сервер LDAP в виде открытого текста, и любой, кто имеет доступ к трафику LDAP, может прослушивать учетные данные пользователя, поэтому это небезопасно.

Одним из решений является использование протокола LDAP (LDAP over SSL), который будет шифровать трафик, проходящий между клиентом и сервером LDAP.

В Spring -Security это легко сделать, и вам нужно изменить URL-адрес вместо « ldap: //stockmarket.com/ », который необходимо использовать «» ldaps: //stockmarket.com/ «. на самом деле, порт для LDAP — 339, а для LDAPS — 636, но к весне это было решено во втором подходе, при первом подходе вам необходимо предоставить эту информацию.

С какой проблемой вы можете столкнуться — «не может найти действительный путь сертификации к запрошенной цели»

Исключение, как показано ниже:

1
2
3
4
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

Причина этого исключения проста: возврат сертификатов во время рукопожатия SSL не подписан никаким доверенным центром сертификации (CA), который настроен в вашем наборе ключей JRE, например, Verisign, Thwate, GoDaddy или entrust и т. Д. Вместо этого сервер отправляет сертификат, который не известно JRE.

Для решения этой проблемы вам необходимо добавить сертификаты, возвращенные сервером, в хранилище ключей JRE. Кстати, если вы запутались между хранилищем ключей и доверенным хранилищем, пожалуйста, прочитайте мою статью о различиях между хранилищем ключей и доверенным хранилищем в Java, чтобы сначала узнать об этом.

2. 7 Что я сделал, чтобы решить проблему

Ничего удивительного, я использую программу с открытым исходным кодом InstallCert.java, просто запускаю ее с вашим сервером LDAP и портом, и она будет пытаться подключиться к серверу LDAP с использованием SSL и сначала выдать тот же « Ошибка построения пути PKIX», а затем сертификаты, возвращенные сервером LDAP.

Затем вам будет предложено добавить сертификат в хранилище ключей, просто укажите номер сертификата, который появился на вашем экране, а затем он добавит этот сертификат в « jssecacerts » в папке C: \ Program Files \ Java \ jdk1.6.0 \ jre \ lib \ security . Теперь перезапустите программу, эта ошибка должна исчезнуть, и она напечатает:

1
2
3
4
5
6
7
"Loading KeyStore jssecacerts...
 
Opening connection to stockmarket.com:636...
 
Starting SSL handshake...
 
No errors, the certificate is already trusted

Мы закончили, теперь, если вы попробуете аутентифицироваться на LDAPS, у вас все получится.

Существует много других подходов для выполнения аутентификации LDAP по активному каталогу даже без использования пружинной безопасности с использованием Java. но я считаю Spring-Security очень полезной, так что подумайте о том, чтобы использовать ее для своих требований безопасности. дайте мне знать, если у вас возникнут какие-либо проблемы во время входа в LDAP, и я сделаю все возможное, чтобы помочь вам.

См. Оригинальную статью здесь: 2 способа настройки аутентификации LDAP Active Directory в Java Spring Security Пример учебника

Мнения, высказанные участниками Java Code Geeks, являются их собственными.