Класс LdapLoginModule
- java.lang.Object
-
- com.sun.security.auth.module.LdapLoginModule
- Все реализуемые интерфейсы:
LoginModule
public class LdapLoginModule extends Object implements LoginModule
Этот LoginModule выполняет аутентификацию на основе LDAP. Имя пользователя и пароль проверяются на соответствие соответствующим учетным данным пользователя, хранящимся в каталоге LDAP. Этот модуль требует от предоставленного CallbackHandler поддержки NameCallback и PasswordCallback. При успешной аутентификации создается новый LdapPrincipal с использованием имени пользователя в каталоге и новый UserPrincipal с использованием имени пользователя, и оба они ассоциируются с текущим Subject.
Этот модуль работает в одном из трех режимов: search-first, authentication-first или authentication-only. Режим выбирается путем указания определенного набора параметров.
В режиме search-first каталог LDAP просматривается для определения имени пользователя в каталоге, а затем выполняется попытка аутентификации. Выполняется поиск (анонимный) с использованием предоставленного имени пользователя в сочетании с указанным фильтром поиска. При успехе выполняется попытка аутентификации с использованием имени пользователя в каталоге и предоставленного пароля. Для включения этого режима установите параметр userFilter и опустите параметр authIdentity. Используйте режим search-first, когда имя пользователя в каталоге не известно заранее.
В режиме authentication-first выполняется попытка аутентификации с использованием предоставленного имени пользователя и пароля, а затем выполняется поиск в каталоге LDAP. При успешной аутентификации выполняется поиск с использованием предоставленного имени пользователя в сочетании с указанным фильтром поиска. Для включения этого режима установите параметры authIdentity и userFilter. Используйте режим authentication-first, когда доступ к каталогу LDAP настроен таким образом, чтобы не допускать анонимных поисков.
В режиме authentication-only выполняется попытка аутентификации с использованием предоставленного имени пользователя и пароля. Поиск в каталоге LDAP не выполняется, поскольку имя пользователя в каталоге уже известно. Для включения этого режима установите параметр authIdentity в допустимое имя в каталоге и опустите параметр userFilter. Используйте режим authentication-only, когда имя пользователя в каталоге известно заранее.
Следующий параметр является обязательным и должен быть указан в настройке входа в модуль 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. Первый активирует режим search-first. Он идентифицирует сервер LDAP и указывает, что записи пользователей должны находиться по их атрибутам uid и objectClass. Он также указывает, что должен быть создан идентификатор, основанный на атрибуте пользователя employeeNumber. Второй активирует режим authentication-first. Он запрашивает динамическое обнаружение сервера LDAP, выполнение аутентификации с использованием непосредственно предоставленного имени пользователя, но без защиты SSL, и поиск записей пользователей по одному из трёх атрибутов именования и их атрибуту objectClass. Третий активирует режим authentication-only. Он идентифицирует альтернативные серверы 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"; }; - Разрешение
- С момента:
- 1.6
Конструкторы
| Конструктор | Описание |
|---|---|
LdapLoginModule() |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean | abort() | Прервать аутентификацию пользователя. |
boolean | commit() | Завершить аутентификацию пользователя. |
void | initialize(Subject subject,
CallbackHandler callbackHandler,
Map<String,?> sharedState,
Map<String,?> options) | Инициализировать данный |
boolean | login() | Начать аутентификацию пользователя. |
boolean | logout() | Выйти из системы пользователя. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Конструкторы
LdapLoginModule
public LdapLoginModule()
Методы
initialize
public void initialize(Subject subject,
CallbackHandler callbackHandler,
Map<String,?> sharedState,
Map<String,?> options) Инициализировать данный LoginModule.
- Указано в:
-
initializeв интерфейсеLoginModule - Параметры:
-
subject- аутентифицируемыйSubject. -
callbackHandler-CallbackHandlerдля получения имени пользователя и пароля. -
sharedState- общиеLoginModuleданные. -
options- опции, указанные вConfigurationдля данногоLoginModule.
login
public boolean login()
throws LoginException Начать аутентификацию пользователя.
Получить учётные данные пользователя и проверить их по заданному каталогу LDAP.
- Указано в:
-
loginв интерфейсеLoginModule - Возвращает:
- всегда true, так как этот
LoginModuleне должен игнорироваться. - Выбрасывает:
-
FailedLoginException- если аутентификация не удалась. -
LoginException- если данныйLoginModuleне может выполнить аутентификацию.
commit
public boolean commit()
throws LoginException Завершить аутентификацию пользователя.
Этот метод вызывается, если общая аутентификация LoginContext прошла успешно (соответствующие REQUIRED, REQUISITE, SUFFICIENT и OPTIONAL LoginModules прошли успешно).
Если собственная попытка аутентификации данного LoginModule прошла успешно (проверяется путём получения сохранённых частных данных методом login), то этот метод ассоциирует LdapPrincipal и один или более UserPrincipal с Subject находящимся в LoginModule. Если собственная попытка аутентификации LoginModule не удалась, то этот метод удаляет все ранее сохранённые данные.
- Указано в:
-
commitв интерфейсеLoginModule - Возвращает:
- true, если собственные попытки входа и подтверждения данного LoginModule прошли успешно, или false в противном случае.
- Выбрасывает:
-
LoginException- если подтверждение не удалось
abort
public boolean abort()
throws LoginException Прервать аутентификацию пользователя.
Этот метод вызывается, если общая аутентификация не удалась. (соответствующие REQUIRED, REQUISITE, SUFFICIENT и OPTIONAL LoginModules не прошли успешно).
Если собственная попытка аутентификации данного LoginModule прошла успешно (проверяется путём получения сохранённых частных данных методами login и commit), то этот метод очищает все сохранённые данные.
- Указано в:
-
abortв интерфейсеLoginModule - Возвращает:
- false, если собственные попытки входа и/или подтверждения данного LoginModule не удались, и true в противном случае.
- Выбрасывает:
-
LoginException- если прерывание не удалось.
logout
public boolean logout()
throws LoginException Выйти из системы пользователя.
Этот метод удаляет Принципы, добавленные методом commit.
- Указано в:
-
logoutв интерфейсеLoginModule - Возвращает:
- true во всех случаях, так как этот
LoginModuleне должен игнорироваться. - Выбрасывает:
-
LoginException- если выход не удался.
© 1993, 2020, 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/11/docs/api/jdk.security.auth/com/sun/security/auth/module/LdapLoginModule.html