Ste že kdaj morali ustvariti mehanizem za preverjanje pristnosti prijave za aplikacijo? Verjetno je, da imate in verjetno večkrat, pri čemer je vsaka nova izvedba blizu, vendar ne enaka prejšnji. Na primer, ena izvedba lahko uporablja bazo podatkov Oracle, druga lahko uporablja overjanje NT, druga pa imenik LDAP (protokol imenika lahkega dostopa). Ali ne bi bilo lepo podpirati vse te varnostne mehanizme, ne da bi spremenili kodo na ravni aplikacije?
Zdaj v svetu Jave lahko to storite s storitvijo Java Authentication and Authorization Service (JAAS). Ta relativno nov API je bil razširitev v J2SE (Java 2 Platform, Standard Edition) 1.3, je osnovni API v J2SE 1.4 in je tudi del specifikacije J2EE (Java 2 Platform, Enterprise Edition) 1.3. V tem članku vas bomo naučili osnov JAAS in vam pokazali, kako učinkovito uporabiti JAAS v resničnih aplikacijah. Aplikacijo v tem članku smo utemeljili na lastnih izkušnjah z integracijo JAAS v obstoječi sistem, ki temelji na Javi, ki je za shranjevanje uporabniških podatkov uporabljal sistem RDBMS (sistem za upravljanje relacijske baze podatkov). Z JAAS smo oblikovali robustnejše, prilagodljivejše in doslednejše mehanizme za prijavo in preverjanje pristnosti.
Iz spodnjih virov lahko prenesete celoten nabor delovnih primerov (vključno z viri Java, JSP-ji (strani JavaServer), konfiguracijo JAAS s skripti za zbirko podatkov in gradnjo). Te primere smo preizkusili z uporabo strežnika Resin z JDBC (Java Database Connectivity) in bazo podatkov MySQL.
Javna overitev in avtorizacija: velika slika
Pred JAAS-om je bil Java-ov varnostni model večinoma oblikovan kot jezik, neodvisen od platforme za distribuirane, povezane v omrežje aplikacije. V zgodnjih dneh se je Java pogosto pojavljala kot mobilna koda, na primer programčki, ki temeljijo na brskalniku, zato se je začetni varnostni model osredotočil na zaščito uporabnikov na podlagi od kod izvira koda in kdo ga je ustvaril. Zgodnji varnostni mehanizmi Java, kot so SecurityManager
Koncept peskovnika, podpisovanje kode in datoteke pravilnikov so bili namenjeni zaščiti uporabnikov pred sistemom.
Izum JAAS odraža razvoj Jave v programski jezik za splošne namene, ki se uporablja za izvajanje tradicionalnih odjemalskih in strežniških aplikacij, ki zahtevajo prijavo in nadzor dostopa. JAAS ščiti sistem pred uporabniki tako, da dovoli ali zavrne dostop na podlagi kdo ali kaj izvaja program. Čeprav lahko JAAS izvaja preverjanje pristnosti in avtorizacijo, se v tem članku osredotočamo predvsem na preverjanje pristnosti.
JAAS vam lahko poenostavi razvoj varnosti Java, tako da postavi abstrakcijski sloj med vašo aplikacijo in različnimi osnovnimi mehanizmi za preverjanje pristnosti in avtorizacije. Ta neodvisnost od platform in algoritmov vam omogoča uporabo različnih varnostnih mehanizmov brez spreminjanja kode na ravni aplikacije. Tako kot pri večini Java-ovih varnostnih API-jev tudi JAAS to neodvisnost od izvedbe doseže z razširljivim okvirom vtičnih vmesnikov ponudnikov storitev (SPI): nizom abstraktnih razredov in vmesnikov, za katere so razvite posebne izvedbe.
Slika 1 spodaj daje pregled na visoki ravni, kako JAAS dosega to priključitev. Vaša koda na ravni aplikacije se ukvarja predvsem z LoginContext
. Pod tem LoginContext
je nabor enega ali več dinamično konfiguriranih LoginModule
s, ki obdelujejo dejansko preverjanje pristnosti z uporabo ustrezne varnostne infrastrukture.
JAAS ponuja nekaj referenc LoginModule
izvedbe, kot je JndiLoginModule
; lahko razvijete tudi svojega, kot bomo tukaj storili z RdbmsLoginModule
. Pokazali bomo tudi, kako lahko s preprosto konfiguracijsko datoteko hitro nastavite aplikacijo z različnimi izvedbami.
JAAS je poleg tega, da ga je mogoče vstaviti, mogoče zložiti: v okviru ene prijave se lahko niz varnostnih modulov zloži drug na drugega, od katerih je vsak poklican v vrstnem redu in vsak medsebojno deluje z različno varnostno infrastrukturo.
Vidiki JAAS so zasnovani na nekaterih znanih varnostnih arhitekturnih vzorcih in obstoječih okvirih. Funkcija, ki jo je mogoče zložiti, na primer namerno spominja na okvir Unix Pluggable Authentication Module (PAM). S transakcijskega vidika JAAS sprejme vedenja, podobna dvofaznim protokolom odobritve (2PC). JAAS-ovi koncepti varnostne konfiguracije, vključno z Politika
datotek in Dovoljenja
, prihajajo iz varnostnih paketov J2SE 1.2. JAAS si izposoja ideje tudi iz drugih uveljavljenih varnostnih okvirov, kot so potrdila X.509, iz katerih izhaja ime Predmet
je izpeljana (izvedeli boste več o Predmet
kasneje).
Opomba: JAAS je le eden od številnih novih varnostnih API-jev Java. Če želite več informacij o varnosti Java, glejte stransko vrstico "Java Security Puzzle" in vire spodaj.
Na strani odjemalca in strežnika JAAS
JAAS lahko uporabite na odjemalcu in strežniku. Kot bomo kmalu pokazali, je uporaba na strani odjemalca preprosta. Na strani strežnika so stvari nekoliko bolj zapletene. Trenutno je JAAS na trgu strežnikov aplikacij nekoliko nedosleden; Strežniki aplikacij J2EE uporabljajo JAAS nekoliko drugače, odvisno od tega, katerega uporabljate. Na primer, JBossSX z lastno arhitekturo lepo vključi JAAS v svoj splošni varnostni okvir (ki je podrobno opisan v odličnem Scott Starku JavaWorld članek "Integriranje varnostnih infrastruktur z JBossSX" (avgust 2001)). Čeprav WebLogic 6.x podpira JAAS, se podrobnosti razlikujejo.
Tako lahko JAAS razumete tako z vidika strežnika kot odjemalca, primere obeh bomo prikazali v tem članku. Za poenostavitev strežnika bomo uporabili aplikacijski strežnik Resin, da bomo lahko začeli s čistejšim skrilavcem (Resin sicer ima lastno vtično shemo za preverjanje pristnosti, vendar je nestandardna, zato nam uporaba JAAS zagotavlja večjo prenosljivost kasneje).
Jedro JAAS
Če želite začeti uporabljati JAAS, morate najprej zagotoviti, da je nameščen. J2SE 1.4 že vključuje JAAS; J2SE 1.3 ne. Če želite še naprej uporabljati J2SE 1.3, prenesite JAAS iz Sun Microsystems. Ko prenesete in namestite JAAS v dani imenik, se prikaže podimenik z imenom lib
, ki vsebuje eno datoteko z imenom jaas.jar
. To datoteko boste morali dodati na pot učil ali jo kopirati v imenik razširitev JRE (Java Runtime Environment) (v \ lib \ ext
, kje je lokacija vašega JRE). Nato ste pripravljeni na JAAS. Opomba: Če uporabljate strežnik aplikacij, morda že vključuje JAAS. Za podrobnosti poglejte v dokumentacijo strežnika.
Pri katerem koli od teh pristopov upoštevajte, da lahko v datoteki z zaščitnimi lastnostmi Java spremenite nekatere nastavitve sistemskih lastnosti, povezane z JAAS (in številne druge varnostne nastavitve Java). Ta datoteka, java.security
, se nahaja v / lib / varnost
imenika in napisana v standardni obliki datoteke z lastnostmi Java.
Uporaba overjanja JAAS iz vaše aplikacije običajno vključuje naslednje korake:
- Ustvariti
LoginContext
- Neobvezno podajte a
CallbackHandler
doLoginContext
, za zbiranje ali obdelavo avtentikacijskih podatkov - Izvedite preverjanje pristnosti tako, da pokličete
LoginContext
jeVpiši se()
metoda - Izvedite privilegirana dejanja z uporabo vrnjenega
Predmet
(ob predpostavki, da je prijava uspela)
Tu je minimalni primer:
LoginContext lc = novo LoginContext ("MyExample"); poskusite {lc.login (); } catch (LoginException) {// Preverjanje pristnosti ni uspelo. } // Preverjanje pristnosti je uspešno, zdaj lahko nadaljujemo. // Vrnjeno Zadevo lahko uporabimo, če želimo. Subject sub = lc.getSubject (); Subject.doAs (pod, novo MyPrivilegedAction ());
Pod platnicami se zgodi še nekaj stvari:
- Med inicializacijo se
LoginContext
najde vnos konfiguracije"MojPrimer"
v konfiguracijski datoteki JAAS (ki ste jo konfigurirali), da določite kateroLoginModule
s za nalaganje (glej sliko 2) - Med prijavo je
LoginContext
pokliče vsakLoginModule
jeVpiši se()
metoda - Vsak
Vpiši se()
metoda izvede preverjanje pristnosti ali vpiše aCallbackHandler
- The
CallbackHandler
uporablja enega ali večPoklicati nazaj
s za interakcijo z uporabnikom in zbiranje vhodnih podatkov - Novo
Predmet
primerek je zapolnjen s podrobnostmi preverjanja pristnosti, kot jeRavnatelj
s in poverilnice
Spodaj bomo razložili nadaljnje podrobnosti, za začetek pa si oglejmo ključne razrede in vmesnike JAAS, vključene v postopek. Ti so običajno razdeljeni v naslednje tri skupine:
Tabela 1. Razredi in vmesniki JAAS
Običajni | Predmet , Ravnatelj , poverilnica (poverilnica ni noben določen razred, lahko pa je kateri koli predmet) |
Preverjanje pristnosti | LoginContext , LoginModule , CallbackHandler , Poklicati nazaj |
Pooblastilo | Politika , AuthPermission , PrivateCredentialPermission |
Večina teh razredov in vmesnikov je v javax.security.auth
paketov, z nekaterimi vnaprej vgrajenimi izvedbami v com.sun.security.auth
paket, vključen samo v J2SE 1.4.
Opomba: Ker se v tem članku osredotočamo na preverjanje pristnosti, se ne poglabljamo v avtorizacijske razrede.
Pogosti: predmeti, ravnatelji in poverilnice
The Predmet
razred predstavlja overjeno entiteto: končnega uporabnika ali skrbnika ali spletno storitev, napravo ali drug postopek. Razred vsebuje tri sklope vrst varnostnih informacij:
- Identitete: V obliki enega ali več
Ravnatelj
s - Javna pooblastila: Kot so ime ali javni ključi
- Zasebne poverilnice: Tako kot gesla ali zasebni ključi
Ravnatelj
s predstavljajo Predmet
identitete. Izvajajo java.security.Principal
vmesnik (ki je pred JAAS) in java.io.Serializable
. A Predmet
je najpomembnejša metoda getName ()
, ki vrne ime niza identitete. Ker a Predmet
Primer vsebuje matriko Ravnatelj
s, lahko ima torej več imen. Ker lahko številka socialnega zavarovanja, ID za prijavo, e-poštni naslov itd. Predstavljajo enega uporabnika, se več identitet v resničnem svetu izkaže za pogosto.
Zadnji element tukaj, poverilnica, ni razred ali vmesnik, lahko pa je kateri koli predmet. Poverilnice lahko vključujejo kakršen koli artefakt za preverjanje pristnosti, kot je vstopnica, ključ ali geslo, ki bi ga morda potrebovali določeni varnostni sistemi. The Predmet
razred ohranja edinstveno Nastavite
zasebnih in javnih poverilnic, ki jih je mogoče pridobiti z metodami, kot so getPrivateCredentials ()
in getPublicCrendentials ()
. Te metode pogosteje uporabljajo varnostni podsistemi kot na aplikacijski ravni.
Preverjanje pristnosti: LoginContext
Vaša aplikacijska plast uporablja LoginContext
kot primarni razred za overjanje Predmet
s. LoginContext
predstavlja tudi, kje pride v poštev JAAS-ova dinamična vtičnost, kajti ko sestavite a LoginContext
, določite imenovano konfiguracijo za nalaganje. The LoginContext
ponavadi naloži podatke o konfiguraciji iz besedilne datoteke, ki nato sporoči LoginContext
ki LoginModule
s za uporabo med prijavo.
Tri najpogosteje uporabljene metode v LoginContext
so:
Tabela 2. Metode LoginContext
Vpiši se() | Izvede prijavo, razmeroma zapleten korak, ki prikliče vse LoginModule s, določeni za to konfiguracijo. Če uspe, ustvari overjeno Predmet . Če ne uspe, vrže a LoginException . |
getSubject () | Vrne overjeno Predmet . |
Odjava() | Odjavi preverjeno pristnost Predmet in ga odstrani Ravnatelj s in poverilnice. |
Kako uporabljati te metode bomo pokazali kasneje.
Preverjanje pristnosti: LoginModule
LoginModule
je vmesnik za določene avtentikacijske mehanizme. J2SE 1.4 je dobavljen z nizom pripravljenih za uporabo LoginModules
, vključno z:
Tabela 3. Moduli za prijavo v J2SE 1.4
JndiLoginModule | Preveri v imeniški storitvi, konfigurirani pod JNDI (Java Iaming and Directory Interface) |
Krb5LoginModule | Preverjanje pristnosti s pomočjo protokolov Kerberos |
NTLoginModule | Za preverjanje pristnosti uporablja trenutne uporabnikove varnostne informacije NT |
UnixLoginModule | Za preverjanje pristnosti uporablja trenutne uporabniške varnostne informacije Unix |
Skupaj s temi moduli je na voljo tudi ustrezen beton Ravnatelj
izvedbe v com.sun.security.auth
paket, kot je NTDomenaGlavno
in UnixPrincipal
.
The LoginModule
vmesnik ima pet načinov:
Tabela 4. Metode LoginModule
inicializiraj () | Klicano po LoginModule je zgrajena. |
| Opravi overjanje. |
zaveži () | Poklical LoginContext potem ko je sprejel rezultate od vseh LoginModule za to aplikacijo. Dodelimo Ravnatelj in poverilnice za Predmet tukaj. |
prekini () | Klican, kadar koli LoginModule saj ta aplikacija ne uspe (čeprav so prejšnje zaporedoma morda uspele - torej podobno kot model 2PC). Ne Ravnatelj ali poverilnice so dodeljene Predmet . |
Odjava() | Odstrani Ravnatelj in poverilnice, povezane z Predmet . |
Programska plast nobene od teh metod ne pokliče neposredno - LoginContext
jih po potrebi prikliče. Naš spodnji primer bo podrobneje opisal izvedbe teh metod.
Preverjanje pristnosti: Povratni klici in povratni klici
CallbackHandler
s in Poklicati nazaj
s pusti a LoginModule
od uporabnika ali sistema zbrati potrebne podatke za preverjanje pristnosti, pri tem pa ostati neodvisen od dejanskega mehanizma interakcije. To sposobnost bomo izkoristili pri svojem oblikovanju - našem RdbmsLoginModule
ni odvisno od tega, kako so uporabniške poverilnice (uporabniško ime / geslo) pridobljene in jih je zato mogoče uporabiti v različnih okoljih aplikacij, ki jih bomo prikazali (bodisi iz ukazne vrstice bodisi iz JSP).