Vai jums kādreiz ir nepieciešams izveidot pieteikšanās autentifikācijas mehānismu lietojumprogrammai? Ir izredzes, ka jums ir, un, iespējams, vairāk nekā vienu reizi, kad katra jaunā ieviešana ir tuvu, bet nav identiska iepriekšējai. Piemēram, vienā ieviešanā var izmantot Oracle datu bāzi, citā - NT autentifikāciju, bet citā - LDAP (vieglā piekļuves direktorija protokola) direktoriju. Vai nebūtu jauki atbalstīt visus šos drošības mehānismus, nemainot nevienu lietojumprogrammas līmeņa kodu?
Tagad Java pasaulē jūs varat to izmantot, izmantojot Java autentifikācijas un autorizācijas pakalpojumu (JAAS). Šī salīdzinoši jaunā API bija J2SE (Java 2 Platform, Standard Edition) 1.3 paplašinājums, tā ir galvenā J2SE 1.4 API un ir arī daļa no J2EE (Java 2 Platform, Enterprise Edition) 1.3 specifikācijas. Šajā rakstā mēs iemācīsim jums JAAS pamatinformāciju un parādīsim, kā efektīvi pielietot JAAS reālās lietojumprogrammās. Šī raksta lietojumprogramma tika balstīta uz mūsu pašu pieredzi, integrējot JAAS esošajā Java tīmekļa sistēmā, kurā lietotāja pieteikšanās informācijas glabāšanai tika izmantota RDBMS (relāciju datu bāzes pārvaldības sistēma). Izmantojot JAAS, mēs izstrādājām stabilākus, elastīgākus un konsekventākus pieteikšanās un autentifikācijas mehānismus.
Pilnu darba piemēru komplektu varat lejupielādēt no zemāk esošajiem resursiem (iekļaujot Java avotus, JSP (JavaServer Pages), JAAS konfigurāciju ar datu bāzēm un skriptiem). Mēs pārbaudījām šos piemērus, izmantojot Resin serveri ar JDBC (Java Database Connectivity) un MySQL datu bāzi.
Java autentifikācija un autorizācija: kopaina
Pirms JAAS Java drošības modeli galvenokārt veidoja tā izcelsme kā platformas neatkarīga valoda izplatītām, tīklā esošām lietojumprogrammām. Pirmajās dienās Java bieži parādījās kā mobilais kods, piemēram, pārlūkprogrammas sīklietotnes, un tāpēc sākotnējais drošības modelis bija vērsts uz lietotāju aizsardzību, pamatojoties uz kur kods radies un kas to izveidoja. Agrīni Java drošības mehānismi, piemēram, SecurityManager
s, smilškastes koncepcija, koda parakstīšana un politikas faili bija domāti, lai aizsargātu lietotājus no sistēmas.
JAAS izgudrojums atspoguļo Java attīstību vispārējas nozīmes programmēšanas valodā, ko izmanto tradicionālo klientu un serveru lietojumprogrammu ieviešanai, kurām nepieciešama pieteikšanās un piekļuves kontrole. JAAS aizsargā sistēmu no lietotājiem, atļaujot vai liedzot piekļuvi, pamatojoties uz kas vai kas vada programmu. Lai gan JAAS var veikt gan autentifikāciju, gan autorizāciju, šajā rakstā mēs galvenokārt koncentrējamies uz autentifikāciju.
JAAS var vienkāršot Java drošības izstrādi, ievietojot abstrakcijas slāni starp jūsu lietojumprogrammu un atšķirīgiem pamatā esošajiem autentifikācijas un autorizācijas mehānismiem. Šī neatkarība no platformām un algoritmiem ļauj izmantot dažādus drošības mehānismus, nemainot lietojumprogrammas līmeņa kodu. Tāpat kā lielākajai daļai Java drošības API, arī JAAS šo ieviešanas neatkarību sasniedz, izmantojot paplašināmu pakalpojumu sniedzēju saskarņu (SPI) paplašināmu sistēmu: abstraktu klašu un saskarņu kopumu, kuriem tiek izstrādātas īpašas ieviešanas iespējas.
1. attēlā sniegts augsta līmeņa pārskats par to, kā JAAS sasniedz šo spraudni. Jūsu lietojumprogrammas slāņa kods galvenokārt attiecas uz a LoginContext
. Zem tā LoginContext
ir viena vai vairāku dinamiski konfigurētu kopa Pieteikšanās modulis
s, kas apstrādā faktisko autentifikāciju, izmantojot atbilstošu drošības infrastruktūru.
JAAS sniedz zināmu atsauci Pieteikšanās modulis
ieviešana, piemēram, JndiLoginModule
; jūs varat arī izveidot savu, kā mēs šeit darīsim ar RdbmsLoginModule
. Mēs arī parādīsim, kā jūs varat ātri iestatīt lietojumprogrammu, izvēloties ieviešanu, izmantojot vienkāršu konfigurācijas failu.
Papildus tam, ka JAAS ir iespraužams, tas ir sakraujams: vienas pieteikšanās kontekstā drošības moduļu komplekts var sakraut viens uz otra, katrs tiek saukts kārtībā un katrs mijiedarbojas ar atšķirīgu drošības infrastruktūru.
JAAS aspekti tiek veidoti pēc dažiem pazīstamiem drošības arhitektūras modeļiem un esošajiem ietvariem. Piemēram, sakraujamā funkcija apzināti atgādina Unix Pluggable Authentication Module (PAM) sistēmu. No darījumu viedokļa JAAS pieņem uzvedību, kas līdzīga divfāzu saistību (2PC) protokoliem. JAAS drošības konfigurācijas koncepcijas, ieskaitot Politika
faili un Atļaujas
, nāk no J2SE 1.2 drošības pakotnēm. JAAS arī aizņemas idejas no citiem izveidotiem drošības ietvariem, piemēram, X.509 sertifikātiem, no kuriem nosaukums Priekšmets
ir atvasināts (jūs uzzināsiet vairāk par Priekšmets
vēlāk).
Piezīme: JAAS ir tikai viens no vairākiem jaunajiem Java drošības API. Lai uzzinātu vairāk par Java drošību, skatiet sānjoslu "Java drošības mīkla" un resursus zemāk.
Klienta un servera puses JAAS
Jūs varat lietot JAAS gan klientā, gan serverī. Tā lietošana klienta pusē ir vienkārša, kā mēs to drīz parādīsim. Servera pusē lietas kļūst nedaudz sarežģītākas. Pašlaik JAAS lietojumprogrammu serveru tirgū ir nedaudz nekonsekventa; J2EE lietotņu serveri JAAS izmanto nedaudz atšķirīgi, atkarībā no tā, kuru izmantojat. Piemēram, JBossSX, izmantojot savu arhitektūru, lieliski integrē JAAS savā vispārējā drošības sistēmā (kas ir sīki aprakstīts Skota Stārka izcilajā JavaWorld raksts "Drošības infrastruktūras integrēšana ar JBossSX" (2001. gada augusts)). Lai gan WebLogic 6.x atbalsta JAAS, informācija atšķiras.
Tātad jūs varat saprast JAAS gan no servera, gan no klienta puses, šajā rakstā mēs parādīsim abu piemērus. Un servera vienkāršības labad mēs izmantosim Resin lietojumprogrammu serveri, lai mēs varētu sākt ar tīrāku šīferi (sveķiem patiešām ir sava pievienojama autentifikācijas shēma, taču tā ir nestandarta, tāpēc JAAS izmantošana dod mums lielāku pārnesamību iespējas vēlāk).
JAAS kodols
Lai sāktu darbu ar JAAS, vispirms jāpārliecinās, ka tā ir instalēta. J2SE 1.4 jau ietver JAAS; J2SE 1.3 nav. Ja vēlaties turpināt izmantot J2SE 1.3, lejupielādējiet JAAS no Sun Microsystems. Kad esat lejupielādējis un instalējis JAAS noteiktā direktorijā, jūs redzēsiet apakšdirektoriju ar nosaukumu lib
, kurā ir viens nosaukums ar nosaukumu jaas.jar
. Šis fails būs jāpievieno klases ceļā vai jākopē JRE (Java Runtime Environment) paplašinājumu direktorijā ( \ lib \ ext
, kur ir jūsu JRE atrašanās vieta). Pēc tam jūs esat gatavs JAAS. Piezīme: Ja izmantojat lietojumprogrammu serveri, tajā jau var būt JAAS. Sīkāku informāciju skatiet sava servera dokumentācijā.
Izmantojot jebkuru no šīm pieejām, ņemiet vērā, ka Java drošības īpašību failā varat mainīt dažus ar JAAS saistītos sistēmas rekvizītu iestatījumus (kā arī daudzus citus Java drošības iestatījumus). Šis fails, java.security
, atrodas / lib / security
direktorijā un rakstīts Java īpašību standarta faila formātā.
JAAS autentifikācijas izmantošana no jūsu lietojumprogrammas parasti ietver šādas darbības:
- Izveidojiet a
LoginContext
- Pēc izvēles nokārtot a
Atzvana
uzLoginContext
, autentifikācijas datu vākšanai vai apstrādei - Veiciet autentifikāciju, zvanot uz
LoginContext
'sPieslēgties()
metodi - Veiciet priviliģētas darbības, izmantojot atgriezto
Priekšmets
(pieņemot, ka pieteikšanās ir veiksmīga)
Šeit ir minimāls piemērs:
LoginContext lc = jauns LoginContext ("MyExample"); mēģiniet {lc.login (); } catch (LoginException) {// autentifikācija neizdevās. } // Autentifikācija ir veiksmīga, tagad mēs varam turpināt. // Ja vēlaties, mēs varam izmantot atgriezto Tēmu. Subject sub = lc.getSubject (); Subject.doAs (sub, new MyPrivilegedAction ());
Zem vākiem notiek dažas citas lietas:
- Inicializācijas laikā
LoginContext
atrod konfigurācijas ierakstu"MyExample"
JAAS konfigurācijas failā (kuru konfigurējāt), lai noteiktu, kuršLoginModule
s, lai ielādētu (sk. 2. attēlu) - Pieteikšanās laikā
LoginContext
zvana katramLoginModule
'sPieslēgties()
metodi - Katrs
Pieslēgties()
metode veic autentifikāciju vai piesaista aAtzvana
- The
Atzvana
izmanto vienu vai vairākusAtzvani
s, lai mijiedarbotos ar lietotāju un apkopotu ievaddatus - Jauns
Priekšmets
instancē tiek aizpildīta autentifikācijas informācija, piemēram,Direktors
s un akreditācijas dati
Tālāk mēs paskaidrosim sīkāku informāciju, bet, lai sāktu, apskatīsim galvenās JAAS klases un saskarnes, kas iesaistītas šajā procesā. Parasti tās iedala šādās trīs grupās:
1. tabula. JAAS klases un saskarnes
Bieži | Priekšmets , Direktors , akreditācijas dati (akreditācijas dati nav neviena konkrēta klase, bet var būt jebkurš objekts) |
Autentifikācija | LoginContext , LoginModule , Atzvana , Atzvani |
Atļauja | Politika , AuthPermission , PrivateCredentialPermission |
Lielākā daļa no šīm klasēm un saskarnēm ir javax.security.auth
pakotnes apakšpaketes, ar dažiem iepriekš sagatavotiem ieviešanas veidiem com.sun.security.auth
pakete, kas iekļauta tikai J2SE 1.4.
Piezīme: Tā kā šajā rakstā mēs koncentrējamies uz autentifikāciju, mēs neiedziļināmies autorizācijas klasēs.
Bieži: priekšmeti, galvenie un akreditācijas dati
The Priekšmets
klase apzīmē autentificētu entītiju: galalietotāju vai administratoru, vai tīmekļa pakalpojumu, ierīci vai citu procesu. Klasē ir trīs drošības informācijas veidu komplekti:
- Identitātes: Viena vai vairāku veidā
Direktors
s - Publiski akreditācijas dati: Piemēram, vārds vai publiskās atslēgas
- Privātie akreditācijas dati: Tāpat kā paroles vai privātās atslēgas
Direktors
s pārstāv Priekšmets
identitātes. Viņi īsteno java.security.Principal
interfeiss (kas ir bijis pirms JAAS) un java.io.Serializējams
. A Priekšmets
vissvarīgākā metode ir getName ()
, kas atgriež identitātes virknes nosaukumu. Tā kā a Priekšmets
instancē ir masīvs Direktors
s, tādējādi tam var būt vairāki nosaukumi. Tā kā sociālā nodrošinājuma numurs, pieteikšanās ID, e-pasta adrese un tā tālāk visi var attēlot vienu lietotāju, reālajā pasaulē vairākas identitātes izrādās izplatītas.
Šeit pēdējais elements - akreditācijas dati - nav klase vai saskarne, bet tas var būt jebkurš objekts. Akreditācijas dati var ietvert jebkuru autentifikācijas artefaktu, piemēram, biļeti, atslēgu vai paroli, kas varētu būt nepieciešama īpašām drošības sistēmām. The Priekšmets
klase uztur unikālu Iestatiet
privāto un publisko akreditācijas datu kopas, kuras var iegūt, izmantojot tādas metodes kā getPrivateCredentials ()
un getPublicCrendentials ()
. Šīs metodes drošības apakšsistēmas izmanto biežāk nekā lietojuma slānī.
Autentifikācija: LoginContext
Jūsu lietojumprogrammas slānis izmanto LoginContext
kā primāro klasi autentifikācijai Priekšmets
s. LoginContext
apzīmē arī to, kur parādās JAAS dinamiskā iespraužamība, jo, konstruējot a LoginContext
, norādiet ielādējamo konfigurāciju. The LoginContext
parasti ielādē konfigurācijas informāciju no teksta faila, kas savukārt stāsta LoginContext
kas Pieteikšanās modulis
s, ko izmantot pieteikšanās laikā.
Trīs parasti izmantotās metodes LoginContext
ir:
2. tabula. LoginContext metodes
Pieslēgties() | Veic pieteikšanos - samērā sarežģītu darbību, kas izsauc visus LoginModule s, kas norādītas šai konfigurācijai. Ja tas izdodas, tas izveido autentificētu Priekšmets . Ja tas neizdodas, tas iemet a LoginException . |
getSubject () | Atgriež autentificēto Priekšmets . |
izlogoties() | Atstāj autentificēto Priekšmets un noņem tās Direktors s un akreditācijas dati. |
Mēs vēlāk parādīsim, kā izmantot šīs metodes.
Autentifikācija: LoginModule
Pieteikšanās modulis
ir saskarne ar noteiktiem autentifikācijas mehānismiem. J2SE 1.4 tiek piegādāts ar lietošanai gatavu komplektu Pieteikšanās moduļi
, ieskaitot:
3. tabula. Pieteikšanās moduļi J2SE 1.4
JndiLoginModule | Pārbauda direktoriju pakalpojumu, kas konfigurēts zem JNDI (Java nosaukšana un direktoriju saskarne) |
Krb5LoginModule | Autentificē, izmantojot Kerberos protokolus |
NTLoginModule | Autentifikācijai izmanto pašreizējā lietotāja NT drošības informāciju |
UnixLoginModule | Autentifikācijai izmanto pašreizējā lietotāja Unix drošības informāciju |
Kopā ar šiem moduļiem nāk atbilstoša betona komplekts Direktors
ieviešana com.sun.security.auth
pakete, piemēram, NTDomainPrincipal
un UnixPrincipal
.
The Pieteikšanās modulis
interfeisam ir piecas metodes:
4. tabula. LoginModule metodes
palaist() | Zvanīja pēc LoginModule ir konstruēts. |
| Veic autentifikāciju. |
apņemties () | Piezvanīja LoginContext pēc tam, kad tā ir pieņēmusi rezultātus no visiem LoginModule s šim lietojumam. Mēs piešķiram Direktors s un akreditācijas raksti Priekšmets šeit. |
pārtraukt () | Zvanīja, kad tādi ir Pieteikšanās modulis šai lietojumprogrammai neizdodas (pat ja iepriekšējās secīgi, iespējams, ir izdevušās - līdzīgas 2PC modelim). Nē Direktors s vai akreditācijas dati tiek piešķirti Priekšmets . |
izlogoties() | Noņem Direktors s un akreditācijas dati, kas saistīti ar Priekšmets . |
Lietojumprogrammas slānis nevienu no šīm metodēm tieši neizsauc - LoginContext
pēc vajadzības tos izsauc. Zemāk sniegtajā piemērā tiks detalizēti aprakstīta šo metožu ieviešana.
Autentifikācija: CallbackHandlers un Callback
Atzvana
smiltis Atzvani
s ļauj a Pieteikšanās modulis
apkopot nepieciešamo autentifikācijas informāciju no lietotāja vai sistēmas, vienlaikus paliekot neatkarīgi no faktiskā mijiedarbības mehānisma. Mēs izmantosim šo iespēju mūsu dizainā - mūsu RdbmsLoginModule
nav atkarīgs no tā, kā tiek iegūti lietotāja akreditācijas dati (lietotājvārds / parole), un tādējādi tos var izmantot dažādās piemērošanas vidēs, kuras mēs ilustrēsim (vai nu no komandrindas, vai no JSP).