Аутентификация 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-password= "AD83DgsSe" //manager password /> |
Эта конфигурация не требует пояснений, но в двух словах о manager-dn и пароле, аутентификации LDAP в активном каталоге или любом другом каталоге LDAP выполняется в два этапа: сначала выполняется поиск LDAP для поиска Dn (различаемого имени) пользователя и затем этот Dn используется для выполнения привязки LDAP.
Если привязка успешна, то аутентификация пользователя успешна, иначе она завершается неудачно. Некоторые люди предпочитают удаленное сравнение паролей, чем привязку LDAP , но привязка LDAP — это то, что вы в основном заканчиваете.
Большая часть Active Directory не разрешает операцию анонимного поиска, поэтому для выполнения поиска LDAP у вашей службы должна быть учетная запись LDAP, что мы и предоставили здесь manager-manager и manager-password.property.
Таким образом, теперь вход в LDAP будет выполнен с помощью следующих шагов:
- Ваша служба или приложение связывают себя с LDAP, используя manager-dn и manager-password.
- LDAP поиск для пользователя, чтобы найти UserDn
- Связывание 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, являются их собственными. |