Класс LdapLoginModule
- Все реализуемые интерфейсы:
LoginModule
public class LdapLoginModule extends Object implements LoginModule
LoginModule выполняет аутентификацию на основе LDAP. Имя пользователя и пароль проверяются по соответствующим учетным данным пользователя, хранящимся в каталоге LDAP. Данному модулю требуется, чтобы предоставленный CallbackHandler поддерживал NameCallback и PasswordCallback. При успешной аутентификации создаётся новый LdapPrincipal с использованием имени пользователя в каталоге и новый UserPrincipal с использованием имени пользователя, и оба ассоциируются с текущим Subject. Этот модуль работает в одном из трёх режимов: поиск-сначала, аутентификация-сначала или только-аутентификация. Режим выбирается путём указания определённого набора параметров.
В режиме поиска-сначала каталог LDAP просматривается для определения имени пользователя в каталоге, а затем выполняется попытка аутентификации. Выполняется (анонимный) поиск с использованием предоставленного имени пользователя в сочетании с указанным фильтром поиска. При успехе выполняется попытка аутентификации с использованием имени пользователя в каталоге и предоставленного пароля. Для включения этого режима установите параметр userFilter и опустите параметр authIdentity. Используйте режим поиска-сначала, когда имя пользователя в каталоге неизвестно заранее.
В режиме аутентификация-сначала выполняется попытка аутентификации с использованием предоставленного имени пользователя и пароля, а затем выполняется поиск в каталоге LDAP. При успешной аутентификации выполняется поиск с использованием предоставленного имени пользователя в сочетании с указанным фильтром поиска. Для включения этого режима установите параметры authIdentity и userFilter. Используйте режим аутентификации-сначала, когда доступ к каталогу LDAP настроен таким образом, что анонимные поиски запрещены.
В режиме только-аутентификация выполняется попытка аутентификации с использованием предоставленного имени пользователя и пароля. Поиск в каталоге LDAP не выполняется, так как имя пользователя в каталоге уже известно. Для включения этого режима установите параметр authIdentity со значением допустимого имени в каталоге и опустите параметр userFilter. Используйте режим только-аутентификация, когда имя пользователя в каталоге известно заранее.
Следующий параметр является обязательным и должен быть указан в конфигурации входа в модуль Configuration:
-
userProvider=ldap_urls - Этот параметр идентифицирует каталог LDAP, который хранит записи пользователей. ldap_urls — список разделенных пробелами URL-адресов LDAP (RFC 2255), которые идентифицируют используемый сервер LDAP и позицию в его древовидной структуре каталога, где находятся записи пользователей. При указании нескольких URL-адресов LDAP каждый из них пытается подключиться по очереди, пока не будет установлено первое успешное соединение. Пробелы в компоненте имени в каталоге URL необходимо экранировать с помощью стандартного механизма символа процента ('
%') и двух шестнадцатеричных цифр (см.URI). Компоненты запроса также должны быть опущены из URL.Поддерживается автоматическое обнаружение сервера LDAP через DNS (RFC 2782) (после того, как DNS будет настроен для поддержки такой службы). Он активируется путём пропуска компонентов имени хоста и номера порта из URL LDAP.
Этот модуль также распознаёт следующие необязательные параметры конфигурации входа в модуль Configuration:
-
userFilter=ldap_filter - Этот параметр указывает фильтр поиска, который используется для поиска записи пользователя в каталоге LDAP. Он используется для определения имени пользователя в каталоге.
ldap_filter— строка фильтра LDAP (RFC 2254). Если она содержит специальный токен "{USERNAME}", этот токен будет заменён предоставленным именем пользователя до того, как фильтр будет использован для поиска в каталоге. -
authIdentity=auth_id - Этот параметр указывает идентификатор, используемый для аутентификации пользователя в каталоге LDAP.
auth_idможет быть строкой имени в каталоге LDAP (RFC 2253) или другим именем. Она должна содержать специальный токен "{USERNAME}", который будет заменён предоставленным именем пользователя до использования имени для аутентификации. Обратите внимание, что если этот параметр не содержит имя в каталоге, то необходимо также указать параметрuserFilter. -
authzIdentity=authz_id - Этот параметр указывает идентификатор авторизации для пользователя.
authz_id— любое имя. Если это единственный специальный токен в фигурных скобках, то этот токен рассматривается как имя атрибута и будет заменён одним значением этого атрибута из записи пользователя в LDAP. Если атрибут не найден, параметр игнорируется. Если этот параметр указан и пользователь был успешно аутентифицирован, то создается дополнительныйUserPrincipalс использованием идентификатора авторизации, и он ассоциируется с текущимSubject. -
useSSL - если
false, этот модуль не устанавливает SSL-соединение с сервером LDAP перед попыткой аутентификации. SSL используется для защиты конфиденциальности пароля пользователя, так как он передаётся открытым текстом по LDAP. По умолчанию этот модуль использует SSL. -
useFirstPass - если
true, этот модуль извлекает имя пользователя и пароль из общего состояния модуля, используя "javax.security.auth.login.name" и "javax.security.auth.login.password" соответственно в качестве ключей. Полученные значения используются для аутентификации. Если аутентификация не удалась, попытка повторного подключения не выполняется, и об ошибке сообщается вызывающему приложению. -
tryFirstPass - если
true, этот модуль извлекает имя пользователя и пароль из общего состояния модуля, используя "javax.security.auth.login.name" и "javax.security.auth.login.password" соответственно в качестве ключей. Полученные значения используются для аутентификации. Если аутентификация не удалась, модуль используетCallbackHandlerдля получения нового имени пользователя и пароля и производит ещё одну попытку аутентификации. Если аутентификация не удалась, об ошибке сообщается вызывающему приложению. -
storePass - если
true, этот модуль сохраняет имя пользователя и пароль, полученные отCallbackHandler, в общем состоянии модуля, используя "javax.security.auth.login.name" и "javax.security.auth.login.password" соответственно в качестве ключей. Это не выполняется, если для имени пользователя и пароля уже существуют значения в общем состоянии или если аутентификация не удалась. -
clearPass - если
true, этот модуль очищает имя пользователя и пароль, сохранённые в общем состоянии модуля, после завершения обеих фаз аутентификации (вход и подтверждение). -
debug - если
true, сообщения отладки отображаются в стандартном потоке вывода.
Также могут быть указаны произвольные "свойства JNDI" в Configuration. Они добавляются в среду и передаются поставщику LDAP. Обратите внимание, что следующие четыре свойства JNDI устанавливаются этим модулем напрямую и игнорируются, если они также присутствуют в конфигурации:
-
java.naming.provider.url -
java.naming.security.principal -
java.naming.security.credentials -
java.naming.security.protocol
Ниже приведены три примера Configuration. Первый активирует режим поиска-сначала. Он идентифицирует сервер LDAP и указывает, что записи пользователей должны находиться по их атрибутам uid и objectClass. Он также указывает, что должен быть создан идентификатор на основе атрибута пользователя employeeNumber. Второй активирует режим аутентификация-сначала. Он запрашивает динамическое расположение сервера LDAP, выполнение аутентификации непосредственно по предоставленному имени пользователя, но без защиты SSL, и поиск записей пользователей по одному из трёх атрибутов именования и их атрибуту objectClass. Третий активирует режим только-аутентификация. Он идентифицирует альтернативные серверы LDAP, указывает имя в каталоге для аутентификации и фиксированный идентификатор для авторизации. Поиск в каталоге не выполняется.
ExampleApplication {
com.sun.security.auth.module.LdapLoginModule REQUIRED
userProvider="ldap://ldap-svr/ou=people,dc=example,dc=com"
userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))"
authzIdentity="{EMPLOYEENUMBER}"
debug=true;
};
ExampleApplication {
com.sun.security.auth.module.LdapLoginModule REQUIRED
userProvider="ldap:///cn=users,dc=example,dc=com"
authIdentity="{USERNAME}"
userFilter="(&(|(samAccountName={USERNAME})(userPrincipalName={USERNAME})(cn={USERNAME}))(objectClass=user))"
useSSL=false
debug=true;
};
ExampleApplication {
com.sun.security.auth.module.LdapLoginModule REQUIRED
userProvider="ldap://ldap-svr1 ldap://ldap-svr2"
authIdentity="cn={USERNAME},ou=people,dc=example,dc=com"
authzIdentity="staff"
debug=true;
};
- Примечание:
- При активном
SecurityManagerприложение, создающееLoginContextи использующееLoginModule, должно обладать определёнными разрешениями.Если приложение создаёт контекст входа, используя установленный
Configuration, то оно должно иметь разрешениеAuthPermissionдля создания контекстов входа. Например, следующая политика безопасности разрешает приложению в текущем каталоге пользователя создание любого контекста входа:grant codebase "file:${user.dir}/" { permission javax.security.auth.AuthPermission "createLoginContext.*"; };В альтернативном случае, если приложение создаёт контекст входа, используя указанный вызывающим объектомConfiguration, то приложению должны быть предоставлены разрешения, необходимыеLoginModule. Данный модуль требует следующих двух разрешений:- Разрешение
SocketPermissionдля подключения к серверу LDAP. - Разрешение
AuthPermissionдля изменения набораPrincipal, связанных сSubject.
Например, следующая политика безопасности предоставляет приложению в текущем каталоге пользователя все разрешения, необходимые этому модулю:
grant codebase "file:${user.dir}/" { permission java.net.SocketPermission "*:389", "connect"; permission java.net.SocketPermission "*:636", "connect"; permission javax.security.auth.AuthPermission "modifyPrincipals"; }; - Разрешение
- Since:
- 1.6
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
LdapLoginModule() |
Создаёт LdapLoginModule. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
abort() |
Прерывает аутентификацию пользователя. |
boolean |
commit() |
Завершает аутентификацию пользователя. |
void |
initialize |
Инициализирует этот LoginModule. |
boolean |
login() |
Начинает аутентификацию пользователя. |
boolean |
logout() |
Выходит из системы пользователя. |
Подробное описание конструкторов
LdapLoginModule
public LdapLoginModule()
LdapLoginModule.Подробное описание методов
initialize
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String,?> sharedState, Map<String,?> options)
LoginModule.- Specified by:
-
initializeв интерфейсеLoginModule - Параметры:
-
subject-Subjectдля аутентификации. -
callbackHandler-CallbackHandlerдля получения имени пользователя и пароля. -
sharedState- состояниеLoginModule. -
options- параметры, указанные в контексте входаConfigurationдля конкретногоLoginModule.
login
public boolean login() throws LoginException
Получает учётные данные пользователя и проверяет их по указанному каталогу LDAP.
- Specified by:
-
loginв интерфейсеLoginModule - Возвращает:
- всегда true, так как этот
LoginModuleне должен игнорироваться. - Исключения:
-
FailedLoginException- если аутентификация не удалась. -
LoginException- если этотLoginModuleне может выполнить аутентификацию.
commit
public boolean commit() throws LoginException
Этот метод вызывается, если общая аутентификация прошла успешно (соответствующие модули REQUIRED, REQUISITE, SUFFICIENT и OPTIONAL завершились успешно).
Если попытка аутентификации данного модуля увенчалась успехом (проверяется получением сохранённого в методе login частного состояния), этот метод связывает LdapPrincipal и один или несколько UserPrincipal с объектом Subject, находящимся в LoginModule. Если попытка аутентификации этого модуля завершилась неудачей, этот метод удаляет любое ранее сохранённое состояние.
- Specified by:
-
commitв интерфейсеLoginModule - Возвращает:
- true, если попытки входа и подтверждения модуля завершились успешно, иначе false.
- Исключения:
-
LoginException- если подтверждение не удалось
abort
public boolean abort() throws LoginException
Этот метод вызывается, если общая аутентификация завершилась неудачей. (соответствующие модули REQUIRED, REQUISITE, SUFFICIENT и OPTIONAL не завершились успешно).
Если попытка аутентификации данного модуля увенчалась успехом (проверяется получением сохранённого в методах login и commit частного состояния), этот метод очищает любое ранее сохранённое состояние.
- Specified by:
-
abortв интерфейсеLoginModule - Возвращает:
- false, если попытки входа и/или подтверждения модуля завершились неудачей, и true в противном случае.
- Исключения:
-
LoginException- если прерывание не удалось.
logout
public boolean logout() throws LoginException
Этот метод удаляет принципы, добавленные методом commit.
- Specified by:
-
logoutв интерфейсеLoginModule - Возвращает:
- true во всех случаях, так как этот
LoginModuleне должен игнорироваться. - Исключения:
-
LoginException- если выход не удался.
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/jdk.security.auth/com/sun/security/auth/module/LdapLoginModule.html