JNDI – zabezpečenie prístupu a riešenie častých problémov s JNDI

10. května 2006

Niektorí poskytovatelia adresárových služieb, ako je LDAP, môžu vyžadovať od klienta prístupové meno a heslo pri snahe o pripojení a hľadaní objektov v rámci namespace. Spôsob, ako obvykle splniť požiadavky poskytovateľa, je nastaviť potrebné premenné prostredia pre InitialContext. V tomto článku sa pozrieme, ako na to. V závere si vysvetlíme riešenie bežných problémov, s ktorými sa môžeme stretnúť pri práci s JNDI.

V rozhraní javax.naming.Context sú definované štyri základné premenné prostredia, ktoré vám môžu pomôcť s definovaním úrovne zabezpečenia pri komunikácii s JNDI. Sú to tieto premenné:

  • java.naming.security.authentication
  • java.naming.security.principal
  • java.naming.security.credentials
  • java.naming.security.protocol

Prvá z nich definuje úroveň zabezpečenia, ktorú použijete pri vytváraní objektu javax.naming.InitialContext. Sú tri základné úrovne zabezpečenia, ktoré môžete použiť pri JNDI. Treba vedieť, že premenné prostredia je nutné nastaviť ešte pred vytvorením spomínaného objektu. Použiť teda môžeme tieto tri úrovne:

  • none
  • simple
  • strong

Čo sa týka samotného spôsobu nastavenia premennej, nastaví sa úplne rovnakým spôsobom ako akákoľvek iná premenná prostredia. Ak si dobre pamätáte, tak pre JNDI sa nastavujú premenné v konfiguračnom súbore jndi.properties nasledovným spôsobom:

java.naming.security.authentication=simple

Alebo ich môžete nastaviť priamo v zdrojovom kóde, ak predáte požadovaný parameter konštruktoru triedy javax.naming.InitialContext. Malo by to ísť nasledovným spôsobom:

properties.put(Context.SECURITY_AUTHENTICATION,“simple“);

Myslím, že je úplne jasné, že hore uvedené zápisy povedia službe JNDI, že chcete použiť jednoduchú úroveň zabezpečenia. Ak použijete úroveň simple alebo strong, musíte ešte zadať potrebné hodnoty pre premenné java.naming.security.principal a java.naming.security.credentials. Prvá z nich obvykle reprezentuje užívateľské meno alebo tiež login a druhá heslo pre daný login.

Ak nepoužijete premennú prostredia java.naming.security.authentication, potom ďalší postup závisí od samotnej implementácie služby JNDI. Niektoré automaticky nastavia úroveň na none a použijú login a password guest a iné budú jednoducho ignorovať vaše nastavenia.

Pri použití úrovne zabezpečenia strong budete musieť poskytnúť aj digitálny certifikát ako štandardnú súčasť tohto typu vyššieho zabezpečenia. V závislosti na poskytovateľovi služby JNDI budete možno musieť zabezpečiť aj nastavenie štvrtej premennej prostredia, o ktorej sme si zatiaľ nič viac nepovedali – java.naming.security.protocol. Niektorí poskytovatelia služieb túto hodnotu automaticky určia. Zrejme najpoužívanejší protokol je SSH.

Vo väčšine prípadov vám bude stačiť úroveň zabezpečenia simple. Avšak je úplne na vás, respektíve na špecifických požiadavkách aplikácie, aká úroveň zabezpečenia bude voči klientom vyžadovaná.

Riešenia bežných problémov s JNDI

ClassNotFoundException – vyhodenie výnimky
Ak pri pokuse o prístup k JNDI príde k vyhodeniu tejto výnimky, uistite sa, či máte jndi.jar a ostatné vyžadované knižnice umiestnené v systémovej classpath. Ak používate Java 2 SDK 1.3 či staršie, uistite sa, že táto verzia je podporovaná vaším poskytovateľom služby JNDI.
Nekompatibilita na úrovni verzie Java platformy
Ak vám vznikne výnimka týkajúca sa chýbajúcich Java súborov, bude to pravdepodobne spôsobené tým, že používate staršiu verziu Javy, konkrétne 1.2.2 alebo nižšiu. Samotné JNDI je podporované práve až vyššími verziami. Už napríklad verzia Java 2 SDK 1.3 by nemala mať s JNDI žiadny problém.
NoClassDefFoundError – vyhodenie výnimky
Toto je pomerne známa runtime výnimka, ktorá vznikne vtedy, ak jeden alebo viac vyžadovaných tried nebolo nájdených v classpath. Podobne ako pri výnimke ClassNotFoundException treba sa uistiť, že všetky potrebné knižnice a triedy, vrátane jndi.jar, sú dostupné cez spomínanú premennú.
NoInitialContextException – vyhodenie výnimky
Toto sa vám môže stať, ak ste buď nešpecifikovali premennú prostredia java.naming.initial.context alebo ak túto premennú nie je možné nájsť. Premenná je vyžadovaná na to, aby ste mohli vytvoriť objekt javax.naming.InitialContext.
CommunicationException – vyhodenie výnimky
Vyhodenie tejto výnimky môže mať niekoľko rôznych dôvodov, ale zrejme najčastejším býva nesprávne nastavenie informácie o tom, kde služba JNDI beží. Z toho dôvodu je vhodné skontrolovať, či nastavená informácia naozaj zodpovedá skutočnosti.
Nie je možné lokalizovať súbor jndi.properties
Správne umiestnenie tohto súboru je veľmi dôležité, pretože JNDI musí byť schopné ho lokalizovať. Obvykle, ak sa tento súbor nachádza niekde v classpath, nemal by byť problém s jeho nájdením. Ak to napriek tomu problém je, skúste ho umiestniť do adresára <JAVA_HOME>/lib. Ak máte na danom počítači viac ako jeden súbor jndi.properties, počítajte s tým, že použitý bude ten, ktorý bude nájdený ako prvý. Nikdy však neviete, ktorý to bude.
NameNotFoundException – vyhodenie výnimky
Vyhodenie tejto výnimky najčastejšie znamená, že ste v metóde lookup špecifikovali parameter neexistujúci v rámci služby JNDI, alebo ste ho zadali nesprávne. Niektoré implementácie JNDI vás nútia používať pred samotným názvom parametra aj špeciálny prefix java:/comp/env, preto treba počítať aj s týmto variantom.

Záver

Týmto článkom sme dokončili sériu o technológii Java Naming and Directory Interface. Jeho hlavným cieľom bolo poskytnúť vám niektoré doplnkové a užitočné informácie k článkom o EJB 2.x – Enterprise JavaBeans 2.x, v ktorých sa pomerne často stretnete s vyžívaním možností tejto technológie.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek mojapraca.sk
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *