Перейти до вмісту

Java Naming and Directory Interface

Матеріал з Вікіпедії — вільної енциклопедії.

Java Naming and Directory Interface (JNDI) — Java-прикладний програмний інтерфейс для служб іменування та каталогів. Він дає Java-програмам змогу знаходити дані й ресурси у вигляді Java-об'єктів за їхніми іменами. JNDI не залежить від конкретної реалізації служби й визначає інтерфейс постачальника послуг (SPI), завдяки якому до системи можна підключати різні служби каталогів.[1]

Дані, які знаходять через JNDI, можуть надходити із сервера, звичайного файла або бази даних — це визначає використана реалізація.

Застосування

[ред. | ред. код]

Типові застосування JNDI:

  • підключення Java-програми до зовнішньої служби каталогів, наприклад адресної бази або LDAP-сервера;
  • пошук об'єктів у мережі для Java RMI та Jakarta EE;
  • отримання сервлетом конфігураційних даних, наданих вебконтейнером;[2]
  • доступ до ресурсів на зразок пулів з'єднань із базами даних, черг повідомлень або поштових сеансів.

SPI дає змогу підтримувати практично будь-яку службу іменування чи каталогів, зокрема LDAP, DNS, NIS, службу імен CORBA і файлову систему.

Історія

[ред. | ред. код]

Sun Microsystems уперше оприлюднила специфікацію JNDI 10 березня 1997 року.[3] Згодом API увійшов до стандартних бібліотек платформи Java.

Основні поняття

[ред. | ред. код]

JNDI впорядковує імена ієрархічно. Ім'ям може бути рядок, наприклад org.wikipedia.ejb.MyBean, або об'єкт, що реалізує інтерфейс javax.naming.Name. Ім'я зв'язують з об'єктом, зберігаючи в службі каталогів сам об'єкт або посилання на нього.

Ключове поняття API — контекст, який визначає простір пошуку об'єкта. Початковий контекст слугує відправною точкою, подібно до кореневого каталогу файлової системи. Найпростіший пошук має такий вигляд:

import javax.naming.Context;
import javax.naming.InitialContext;

Context context = new InitialContext();
MyBean bean = (MyBean) context.lookup("com.example.MyBean");

Параметри реалізації — фабрику початкового контексту, адресу постачальника та, за потреби, облікові дані — задають у властивостях середовища або у файлі jndi.properties.

JNDI підтримує:

  • зв'язування об'єкта з іменем;
  • загальні запити до каталогу;
  • сповіщення про зміни записів;
  • розширення LDAP;
  • пошук об'єктів за атрибутами.[4]

Безпека

[ред. | ред. код]

Можливість JNDI звертатися до віддалених служб стала одним із компонентів вразливості Log4Shell: за певних конфігурацій зловмисно сформовані дані могли спричинити JNDI-пошук на контрольованому нападником сервері та подальше виконання коду. У новіших версіях Java можливості віддаленого завантаження класів істотно обмежено.

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. ↑ Java Naming and Directory Interface (JNDI) (англ.). Oracle.
  2. ↑ JNDI Resources HOW-TO. Apache Tomcat User Guide (англ.). Apache Software Foundation.
  3. ↑ Sun Microsystems, Inc. Introduces Java Naming and Directory Interface API (англ.). 10 березня 1997. Архів оригіналу за 8 вересня 2004.
  4. ↑ Search Filters (англ.). Oracle.

Посилання

[ред. | ред. код]