Už ste niekedy potrebovali vytvoriť mechanizmus autentifikácie prihlásenia pre aplikáciu? Kurzy sú, pravdepodobne existujú, a pravdepodobne aj viackrát, pričom každá nová implementácia je blízka, ale nie identická, s predchádzajúcou. Jedna implementácia môže napríklad používať databázu Oracle, iná môže používať autentifikáciu NT a iná adresár LDAP (ľahký prístupový adresárový protokol). Nebolo by pekné podporovať všetky tieto bezpečnostné mechanizmy bez zmeny kódu na úrovni aplikácie?
Teraz vo svete Java môžete používať službu Java Authentication and Authorization Service (JAAS). Toto relatívne nové API bolo rozšírením v J2SE (Java 2 Platform, Standard Edition) 1.3, je jadrom API v J2SE 1.4 a je tiež súčasťou špecifikácie J2EE (Java 2 Platform, Enterprise Edition) 1.3. V tomto článku vás naučíme základné informácie o JAAS a ukážeme vám, ako efektívne používať JAAS na aplikácie v reálnom svete. Aplikáciu tohto článku sme založili na našich vlastných skúsenostiach s integráciou JAAS do existujúceho webového systému Java, ktorý na ukladanie prihlasovacích údajov používateľa používal RDBMS (systém správy relačnej databázy). S JAAS sme navrhli robustnejšie, flexibilnejšie a konzistentnejšie mechanizmy prihlásenia a autentifikácie.
Kompletnú sadu pracovných príkladov si môžete stiahnuť z nižšie uvedených zdrojov (vrátane zdrojov Java, JSP (stránky JavaServer), konfigurácie JAAS s databázou a skriptmi na zostavenie). Tieto príklady sme testovali pomocou živicového servera s JDBC (Java Database Connectivity) a MySQL databázy.
Java autentifikácia a autorizácia: Celkový obraz
Pred JAAS bol bezpečnostný model Javy väčšinou formovaný svojím pôvodom ako jazyk nezávislý na platforme pre distribuované sieťové aplikácie. V začiatkoch sa Java často javila ako mobilný kód, napríklad ako applety založené na prehliadači, a preto sa prvotný model zabezpečenia zameriaval na ochranu používateľov na základe kde kód vznikol a kto ju vytvoril. Včasné bezpečnostné mechanizmy Java, ako napr SecurityManager
s, koncept karantény, podpisovanie kódu a súbory zásad boli určené na ochranu používateľov pred systémom.
Vynález JAAS odráža vývoj Javy v univerzálny programovací jazyk používaný na implementáciu tradičných klientských a serverových aplikácií, ktoré vyžadujú prihlásenie a riadenie prístupu. JAAS chráni systém pred užívateľmi povolením alebo zakázaním prístupu na základe kto alebo čo program spúšťa. Aj keď JAAS môže vykonávať autentifikáciu aj autorizáciu, v tomto článku sa zameriavame predovšetkým na autentifikáciu.
JAAS môže zjednodušiť váš vývoj zabezpečenia v Jave vložením abstrakčnej vrstvy medzi vašu aplikáciu a rôznorodé základné mechanizmy autentifikácie a autorizácie. Táto nezávislosť od platforiem a algoritmov vám umožňuje používať rôzne bezpečnostné mechanizmy bez úpravy kódu na úrovni aplikácie. Rovnako ako u väčšiny bezpečnostných rozhraní Java, JAAS dosahuje túto nezávislosť implementácie prostredníctvom rozšíriteľného rámca zásuvných rozhraní poskytovateľa služieb (SPI): súborom abstraktných tried a rozhraní, pre ktoré sú vyvinuté konkrétne implementácie.
Obrázok 1 nižšie poskytuje prehľad na vysokej úrovni o tom, ako JAAS dosahuje túto zapojiteľnosť. Váš kód na aplikačnej vrstve sa zaoberá predovšetkým a LoginContext
. Pod tým LoginContext
je sada jedného alebo viacerých dynamicky konfigurovaných Prihlasovací modul
s, ktoré spracovávajú skutočné overovanie pomocou príslušnej bezpečnostnej infraštruktúry.
JAAS poskytuje určité odkazy Prihlasovací modul
implementácie, ako napríklad Modul JndiLogin
; môžete si tiež vytvoriť svoj vlastný, ako to urobíme tu s RdbmsLoginModule
. Ukážeme tiež, ako môžete rýchlo nastaviť aplikáciu s výberom implementácií pomocou jednoduchého konfiguračného súboru.
Okrem možnosti zapojenia je JAAS stohovateľný: v rámci jediného prihlásenia sa môže sada bezpečnostných modulov ukladať na seba, každý volaný v poradí a každý interaguje s inou bezpečnostnou infraštruktúrou.
Aspekty JAAS sú modelované na niektorých známych bezpečnostných architektonických vzoroch a existujúcich rámcoch. Stohovateľná funkcia sa napríklad zámerne podobá na rámec Unix Pluggable Authentication Module (PAM). Z transakčného hľadiska JAAS preberá správanie podobné protokolom dvojfázového odovzdania (2PC). Koncepty bezpečnostnej konfigurácie JAAS vrátane Politika
súbory a Povolenia
, pochádzajú z bezpečnostných balíkov J2SE 1.2. Spoločnosť JAAS si tiež požičiava nápady z iných zavedených bezpečnostných rámcov, ako sú napríklad certifikáty X.509, z ktorých názov pochádza Predmet
je odvodené (dozviete sa viac o Predmet
neskôr).
Poznámka: JAAS je iba jedným z niekoľkých nových bezpečnostných rozhraní Java. Viac informácií o zabezpečení Java nájdete na bočnom paneli „The Java Security Puzzle“ a zdrojoch nižšie.
JAAS na strane klienta a servera
Aplikáciu JAAS môžete použiť na klientovi aj serveri. Jeho použitie na strane klienta je priame, ako si ukážeme čoskoro. Na strane servera sa veci trochu komplikujú. V súčasnosti sú JAAS na trhu aplikačných serverov trochu nekonzistentné; Servery aplikácií J2EE používajú JAAS mierne odlišne, v závislosti od toho, ktorý používate. Napríklad JBossSX pomocou svojej vlastnej architektúry pekne integruje JAAS do svojho celkového bezpečnostného rámca (ktorý je podrobne uvedený v JavaWorld článok „Integrácia bezpečnostných infraštruktúr s JBossSX“ (august 2001)). Aj keď WebLogic 6.x podporuje JAAS, podrobnosti sa líšia.
Takže môžete pochopiť JAAS z pohľadu servera aj klienta, v tomto článku si ukážeme príklady oboch. A pre jednoduchosť na serveri použijeme aplikačný server Resin, aby sme mohli začať s čistejšou tabuľou (Resin má vlastnú zásuvnú autentifikačnú schému, ale je to neštandardné, takže použitie JAAS nám dáva väčšiu prenosnosť možnosti neskôr).
Jadro JAAS
Ak chcete začať používať JAAS, musíte sa najskôr ubezpečiť, že je nainštalovaný. J2SE 1.4 už obsahuje JAAS; J2SE 1.3 nie. Ak chcete naďalej používať J2SE 1.3, stiahnite si JAAS zo Sun Microsystems. Akonáhle stiahnete a nainštalujete JAAS do daného adresára, uvidíte podadresár s názvom lib
, ktorý obsahuje jeden súbor s názvom jaas.jar
. Tento súbor budete musieť pridať do svojej cesty triedy alebo ho skopírovať do svojho adresára s príponami JRE (Java Runtime Environment) (v \ lib \ ext
, kde je umiestnenie vášho JRE). Potom ste pripravení na JAAS. Poznámka: Ak používate aplikačný server, môže už obsahovať JAAS. Podrobnosti nájdete v dokumentácii k serveru.
Pri ktoromkoľvek z týchto prístupov nezabudnite, že v súbore vlastností zabezpečenia Java môžete zmeniť niektoré nastavenia systému (JAAS) týkajúce sa systémových vlastností (ako aj mnoho ďalších nastavení zabezpečenia Java). Tento súbor, java.bezpečnosť
, sa nachádza v / lib / bezpečnosť
adresár a napísané v štandardnom formáte súboru vlastností Java.
Používanie autentifikácie JAAS z vašej aplikácie zvyčajne zahŕňa nasledujúce kroky:
- Vytvor
LoginContext
- Voliteľne zložiť a
CallbackHandler
doLoginContext
, na zhromažďovanie alebo spracovanie autentifikačných údajov - Overenie vykonajte zavolaním na server
LoginContext
jePrihlásiť sa()
metóda - Vykonajte privilegované akcie pomocou vráteného
Predmet
(za predpokladu úspešného prihlásenia)
Tu je minimálny príklad:
LoginContext lc = nový LoginContext ("Môj príklad"); skus {lc.login (); } catch (LoginException) {// Overenie zlyhalo. } // Autentifikácia úspešná, teraz môžeme pokračovať. // Vrátený Subjekt môžeme použiť, ak sa nám páči. Predmet sub = lc.getSubject (); Subject.doAs (sub, nová MyPrivilegedAction ());
Pod krytmi sa vyskytuje niekoľko ďalších vecí:
- Počas inicializácie sa
LoginContext
vyhľadá položku konfigurácie„Môj príklad“
v konfiguračnom súbore JAAS (ktorý ste nakonfigurovali), aby ste určili, ktorýPrihlasovací modul
s na načítanie (pozri obrázok 2) - Počas prihlásenia
LoginContext
volá každýPrihlasovací modul
jePrihlásiť sa()
metóda - Každý
Prihlásiť sa()
metóda vykonáva autentifikáciu alebo získava aCallbackHandler
- The
CallbackHandler
používa jeden alebo viacZavolaj späť
s na interakciu s používateľom a zhromažďovanie vstupných informácií - Nový
Predmet
inštancia je vyplnená podrobnosťami autentifikácie ako naprPrincipal
s a poverenia
Ďalej vysvetlíme ďalšie podrobnosti, ale najskôr sa pozrime na kľúčové triedy a rozhrania JAAS zapojené do procesu. Spravidla sa delia do nasledujúcich troch skupín:
Tabuľka 1. Triedy a rozhrania JAAS
Bežné | Predmet , Principal , poverenie (poverenie nie je žiadna konkrétna trieda, ale môže to byť akýkoľvek objekt) |
Overenie | LoginContext , Prihlasovací modul , CallbackHandler , Zavolaj späť |
Povolenie | Politika , AuthPermission , PrivateCredentialPermission |
Väčšina z týchto tried a rozhraní je v javax.security.auth
čiastkové balíčky balíka s niektorými vopred pripravenými implementáciami v priečinku com.sun.security.auth
balík, zahrnutý iba v J2SE 1.4.
Poznámka: Pretože sa v tomto článku zameriavame na autentifikáciu, nebudeme sa venovať autorizačným triedam.
Časté: Predmety, riaditelia a poverovacie listiny
The Predmet
trieda predstavuje autentifikovanú entitu: koncového používateľa alebo správcu alebo webovú službu, zariadenie alebo iný proces. Trieda obsahuje tri sady typov bezpečnostných informácií:
- Totožnosti: Vo forme jedného alebo viacerých
Principal
s - Verejné údaje: Napríklad meno alebo verejné kľúče
- Súkromné údaje: Rovnako ako heslá alebo súkromné kľúče
Principal
s predstavujú Predmet
totožnosti. Vykonávajú java.bezpečnosť.Principal
rozhranie (ktoré predchádza JAAS) a java.io. Serializovateľné
. A Predmet
najdôležitejšou metódou je getName ()
, ktorý vráti názov reťazca identity. Keďže a Predmet
inštancia obsahuje pole Principal
s, môže tak mať viac mien. Pretože číslo sociálneho zabezpečenia, prihlasovacie ID, e-mailová adresa atď., Môžu všetci predstavovať jedného používateľa, je v reálnom svete bežné viac totožností.
Posledným prvkom, poverením, nie je trieda ani rozhranie, ale môže to byť akýkoľvek objekt. Poverovacie údaje môžu obsahovať akýkoľvek artefakt autentifikácie, napríklad lístok, kľúč alebo heslo, ktorý môžu vyžadovať konkrétne systémy zabezpečenia. The Predmet
trieda zachováva jedinečnosť Nastaviť
so súkromnými a verejnými povereniami, ktoré je možné získať metódami ako napr getPrivateCredentials ()
a getPublicCrendentials ()
. Tieto metódy používajú bezpečnostné podsystémy častejšie ako na aplikačnej vrstve.
Autentifikácia: LoginContext
Vaša aplikačná vrstva používa LoginContext
ako svoju primárnu triedu pre autentifikáciu Predmet
s. LoginContext
tiež predstavuje miesto, kde vstupuje do hry dynamická pripojiteľnosť JAAS, pretože keď skonštruujete a LoginContext
, zadáte pomenovanú konfiguráciu, ktorá sa má načítať. The LoginContext
zvyčajne načíta informácie o konfigurácii z textového súboru, ktorý zase informuje LoginContext
ktoré Prihlasovací modul
s použiť počas prihlásenia.
Tri bežne používané metódy v LoginContext
sú:
Tabuľka 2. Metódy LoginContext
Prihlásiť sa() | Vykoná prihlásenie, čo je pomerne zložitý krok, ktorý vyvolá všetky Prihlasovací modul pre túto konfiguráciu je zadané. Ak bude úspešný, vytvorí sa autentifikovaný Predmet . Ak zlyhá, hodí a Prihlasovacia výnimka . |
getSubject () | Vráti overený Predmet . |
odhlásiť sa() | Odhlási overené Predmet a odstráni jeho Principal s a poverenia. |
Neskôr sa ukážeme, ako tieto metódy použiť.
Autentifikácia: LoginModule
Prihlasovací modul
je rozhranie k špecifickým mechanizmom autentifikácie. J2SE 1.4 sa dodáva so sadou pripravených na použitie Prihlasovacie moduly
, počítajúc do toho:
Tabuľka 3. LoginModules v J2SE 1.4
Modul JndiLogin | Overuje oproti adresárovej službe nakonfigurovanej v rámci JNDI (Java Naming and Directory Interface) |
Modul Krb5Login | Overuje pomocou protokolov Kerberos |
NTLoginModule | Používa na autentifikáciu bezpečnostné informácie NT aktuálneho používateľa |
UnixLoginModule | Používa na autentifikáciu bezpečnostné informácie Unixu aktuálneho používateľa |
Spolu s týmito modulmi prichádza aj sada zodpovedajúceho betónu Principal
implementácie v com.sun.security.auth
balíček, ako napr NTDomainPrincipal
a UnixPrincipal
.
The Prihlasovací modul
rozhranie má päť metód:
Tabuľka 4. Metódy LoginModule
inicializovať () | Volal po Prihlasovací modul je skonštruovaný. |
| Vykoná autentifikáciu. |
spáchať () | Volal LoginContext po prijatí výsledkov od všetkých Prihlasovací modul sú definované pre túto aplikáciu. Priradíme Principal s a poverenia do Predmet tu. |
prerušiť () | Volal, keď existuje Prihlasovací modul pretože táto aplikácia zlyhala (aj keď tie staršie v poradí mohli uspieť - teda podobné ako v prípade modelu 2PC). Nie Principal alebo poverenia sú pridelené Predmet . |
odhlásiť sa() | Odstráni Principal a poverenia spojené s Predmet . |
Aplikačná vrstva nenavolá žiadnu z týchto metód priamo - LoginContext
vyvoláva ich podľa potreby. Náš príklad nižšie bude rozpracovávať implementácie týchto metód.
Autentifikácia: CallbackHandlers a Callbacks
CallbackHandler
s a Zavolaj späť
s nech a Prihlasovací modul
zhromažďovať potrebné autentifikačné informácie od používateľa alebo systému, pričom zostáva nezávislý od skutočného mechanizmu interakcie. Túto schopnosť využijeme v našom dizajne - našom RdbmsLoginModule
nezávisí od toho, ako sa získajú poverenia používateľa (používateľské meno / heslo), a dá sa teda použiť v rôznych prostrediach aplikácií, ktoré ilustrujeme (buď z príkazového riadku alebo z JSP).