Har du nogensinde haft brug for at oprette en login-godkendelsesmekanisme til en applikation? Odds er, du har, og sandsynligvis mere end én gang, hvor hver ny implementering er tæt, men ikke identisk, med den forrige. For eksempel kan en implementering muligvis bruge en Oracle-database, en anden muligvis bruge en NT-godkendelse og en anden en LDAP-bibliotek (lightweight access directory protocol). Ville det ikke være rart at understøtte alle disse sikkerhedsmekanismer uden at ændre nogen applikationsniveau-kode?
Nu i Java-verdenen kan du med Java Authentication and Authorization Service (JAAS). Denne relativt nye API var en udvidelse i J2SE (Java 2 Platform, Standard Edition) 1.3, er en central API i J2SE 1.4 og er også en del af J2EE (Java 2 Platform, Enterprise Edition) 1.3-specifikationen. I denne artikel vil vi lære dig JAAS-essentials og vise dig, hvordan du effektivt anvender JAAS til applikationer i den virkelige verden. Vi baserede denne artikels applikation på vores egne erfaringer med at integrere JAAS i et eksisterende Java-webbaseret system, der brugte et RDBMS (relationsdatabasestyringssystem) til lagring af brugerloginoplysninger. Med JAAS designede vi mere robuste, fleksible og konsekvente login- og godkendelsesmekanismer.
Du kan downloade et komplet sæt arbejdseksempler fra nedenstående ressourcer (inkluderer Java-kilder, JSP'er (JavaServer-sider), JAAS-konfiguration med database- og build-scripts). Vi testede disse eksempler ved hjælp af Resin-serveren med JDBC (Java Database Connectivity) og MySQL-databasen.
Java-godkendelse og autorisation: det store billede
Før JAAS blev Java's sikkerhedsmodel for det meste formet af dets oprindelse som et platformuafhængigt sprog til distribuerede netværksapplikationer. I sine tidlige dage optrådte Java ofte som mobil kode, såsom browserbaserede applets, og derfor fokuserede den oprindelige sikkerhedsmodel på at beskytte brugere baseret på hvor koden opstod og der skabte det. Tidlige Java-sikkerhedsmekanismer som f.eks SecurityManager
s, sandkassekonceptet, kodesignering og politikfiler var alle beregnet til at beskytte brugerne mod systemet.
Opfindelsen af JAAS afspejler Java's udvikling til et generelt programmeringssprog, der bruges til implementering af traditionelle klient- og serverapplikationer, der kræver login og adgangskontrol. JAAS beskytter systemet mod brugere ved at tillade eller nægte adgang baseret på hvem eller hvad der kører programmet. Mens JAAS kan udføre både godkendelse og godkendelse, fokuserer vi i denne artikel primært på godkendelse.
JAAS kan forenkle din Java-sikkerhedsudvikling ved at placere et abstraktionslag mellem din applikation og forskellige underliggende godkendelses- og autorisationsmekanismer. Denne uafhængighed af platforme og algoritmer giver dig mulighed for at bruge forskellige sikkerhedsmekanismer uden at ændre din applikationsniveau-kode. Som med de fleste Java-sikkerheds-API'er opnår JAAS denne implementeringsuafhængighed gennem en udvidelig ramme med tilslutbare serviceudbydergrænseflader (SPI'er): et sæt abstrakte klasser og grænseflader, som specifikke implementeringer udvikles til.
Figur 1 nedenfor giver et overblik på højt niveau af, hvordan JAAS opnår denne tilslutning. Din applikationslagskode beskæftiger sig primært med en LoginContext
. Under det LoginContext
er et sæt af en eller flere konfigureret dynamisk LoginModul
s, som håndterer den faktiske godkendelse ved hjælp af den relevante sikkerhedsinfrastruktur.
JAAS giver en vis reference LoginModul
implementeringer, som f.eks JndiLoginModule
; Du kan også udvikle din egen, som vi gør her med RdbmsLoginModule
. Vi viser også, hvordan du hurtigt kan oprette en applikation med et valg af implementeringer ved hjælp af en simpel konfigurationsfil.
Ud over at være tilslutningsbar kan JAAS stables: i forbindelse med et enkelt login kan et sæt sikkerhedsmoduler stables oven på hinanden, hver kaldet i rækkefølge og hver interagerer med en anden sikkerhedsinfrastruktur.
JAAS-aspekter er modelleret på nogle velkendte arkitektoniske sikkerhedsmønstre og eksisterende rammer. Den stabelbare funktion ligner f.eks. Bevidst PAM-rammen (Unix Pluggable Authentication Module). Fra et transaktionsmæssigt synspunkt vedtager JAAS adfærd svarende til to-faset commit (2PC) protokoller. JAAS's sikkerhedskonfigurationskoncepter, herunder Politik
filer og Tilladelser
, kommer fra J2SE 1.2 sikkerhedspakker. JAAS låner også ideer fra andre etablerede sikkerhedsrammer, såsom X.509-certifikater, hvorfra navnet kommer Emne
er afledt (du lærer mere om Emne
senere).
Bemærk: JAAS er blot en af flere nye Java-sikkerheds-API'er. For mere om Java-sikkerhed, se sidebjælken "Java Security Puzzle" og ressourcer nedenfor.
JAAS på klient- og serversiden
Du kan anvende JAAS på både klienten og serveren. Brug af det på klientsiden er ligetil, som vi snart vil demonstrere. På serversiden vokser tingene lidt mere komplekse. I øjeblikket er JAAS på applikationsservermarkedet lidt inkonsekvent; J2EE-app-servere bruger JAAS lidt forskelligt, afhængigt af hvilken du bruger. For eksempel integrerer JBossSX JAAS ved hjælp af deres egen arkitektur pænt i sin overordnede sikkerhedsramme (som er detaljeret i Scott Starks fremragende JavaWorld artikel "Integrer sikkerhedsinfrastrukturer med JBossSX" (august 2001)). Men selvom WebLogic 6.x understøtter JAAS, er detaljerne forskellige.
Så du kan forstå JAAS fra både server- og klientsideperspektiver, vi demonstrerer eksempler på begge i denne artikel. Og med henblik på enkelhed på serveren bruger vi Resin-applikationsserveren, så vi kan starte med en renere skifer (Resin har et eget stik, der kan tilsluttes, men det er ikke standard, så brug af JAAS giver os mere bærbarhed indstillinger senere).
Kerne JAAS
For at komme i gang med JAAS skal du først sikre dig, at den er installeret. J2SE 1.4 inkluderer allerede JAAS; J2SE 1.3 gør det ikke. Hvis du vil fortsætte med at bruge J2SE 1.3, skal du downloade JAAS fra Sun Microsystems. Når du har downloadet og installeret JAAS til et givet bibliotek, vil du se en underkatalog kaldet lib
, som indeholder en fil med navnet jaas.jar
. Du bliver nødt til at tilføje denne fil til din klassesti eller kopiere den til din JRE-udvidelsesmappe (Java Runtime Environment) (i \ lib \ ekst
, hvor er din JRE's placering). Du er så JAAS-klar. Bemærk: Hvis du bruger en applikationsserver, inkluderer den muligvis allerede JAAS. Tjek serverens dokumentation for detaljer.
Med en af disse tilgange skal du bemærke, at du kan ændre nogle af de JAAS-relaterede systemegenskabsindstillinger (såvel som mange andre Java-sikkerhedsindstillinger) i Java-sikkerhedsegenskabsfilen. Denne fil, java.sikkerhed
, er placeret i / lib / sikkerhed
katalog og skrevet i standardformatet for Java-egenskaber.
Brug af JAAS-godkendelse fra din applikation involverer typisk følgende trin:
- Lave en
LoginContext
- Valgfrit bestå en
CallbackHandler
tilLoginContext
til indsamling eller behandling af godkendelsesdata - Udfør godkendelse ved at ringe til
LoginContext
'sLog på()
metode - Udfør privilegerede handlinger ved hjælp af den returnerede
Emne
(forudsat at login lykkes)
Her er et minimalt eksempel:
LoginContext lc = ny LoginContext ("MyExample"); prøv {lc.login (); } fange (LoginException) {// Godkendelse mislykkedes. } // Godkendelse lykkedes, vi kan nu fortsætte. // Vi kan bruge det returnerede emne, hvis vi vil. Emne sub = lc.getSubject (); Subject.doAs (sub, ny MyPrivilegedAction ());
Under omslagene optræder et par andre ting:
- Under initialiseringen
LoginContext
finder konfigurationsindgangen"Mit eksempel"
i en JAAS-konfigurationsfil (som du konfigurerede) for at bestemme hvilkenLoginModul
s at indlæse (se figur 2) - Under login,
LoginContext
kalder hverLoginModul
'sLog på()
metode - Hver
Log på()
metoden udfører godkendelsen eller hverver enCallbackHandler
- Det
CallbackHandler
bruger en eller flereRing tilbage
s til at interagere med brugeren og samle input - Et nyt
Emne
forekomst er befolket med godkendelsesdetaljer såsomRektor
s og legitimationsoplysninger
Vi forklarer yderligere detaljer nedenfor, men lad os se på de vigtigste JAAS-klasser og grænseflader, der er involveret i processen. Disse er typisk opdelt i følgende tre grupper:
Tabel 1. JAAS-klasser og grænseflader
almindelige | Emne , Rektor , legitimationsoplysninger (legitimationsoplysninger er ikke nogen bestemt klasse, men kan være et hvilket som helst objekt) |
Godkendelse | LoginContext , LoginModul , CallbackHandler , Ring tilbage |
Bemyndigelse | Politik , AuthPermission , PrivateCredentialPermission |
De fleste af disse klasser og grænseflader er i javax.security.auth
pakkens underpakker med nogle forudbyggede implementeringer i com.sun.security.auth
pakke, kun inkluderet i J2SE 1.4.
Bemærk: Fordi vi fokuserer på godkendelse i denne artikel, dykker vi ikke ned i autorisationsklasser.
Almindelig: Emner, rektorer og legitimationsoplysninger
Det Emne
klasse repræsenterer en godkendt enhed: en slutbruger eller administrator eller en webservice, enhed eller en anden proces. Klassen indeholder tre sæt sikkerhedsoplysningstyper:
- Identiteter: I form af en eller flere
Rektor
s - Offentlige legitimationsoplysninger: Såsom navn eller offentlige nøgler
- Private legitimationsoplysninger: Ligesom adgangskoder eller private nøgler
Rektor
s repræsenterer Emne
identiteter. De implementerer java.security.Principal
interface (som går forud for JAAS) og java.io.Serialiserbar
. EN Emne
's vigtigste metode er getName ()
, som returnerer en identitets strengnavn. Siden en Emne
forekomst indeholder en matrix af Rektor
s, kan det således have flere navne. Fordi et socialsikringsnummer, login-id, e-mail-adresse osv. Alle kan repræsentere en bruger, viser flere identiteter sig almindelige i den virkelige verden.
Det sidste element her, legitimationsoplysninger, er ikke en klasse eller en grænseflade, men kan være et hvilket som helst objekt. Legitimationsoplysninger kan omfatte enhver artefakt til godkendelse, såsom en billet, nøgle eller adgangskode, som specifikke sikkerhedssystemer muligvis kræver. Det Emne
klasse opretholder unik Sæt
s af private og offentlige legitimationsoplysninger, som kan hentes med metoder som f.eks getPrivateCredentials ()
og getPublicCrendentials ()
. Disse metoder bruges oftere af sikkerhedsundersystemer end i applikationslaget.
Godkendelse: LoginContext
Dit applikationslag bruger LoginContext
som sin primære klasse til godkendelse Emne
s. LoginContext
repræsenterer også hvor JAAS dynamiske tilslutningsevne kommer i spil, for når du konstruerer en LoginContext
, angiver du en navngivet konfiguration, der skal indlæses. Det LoginContext
indlæser typisk konfigurationsoplysningerne fra en tekstfil, som igen fortæller LoginContext
hvilken LoginModul
s til brug under login.
De tre almindeligt anvendte metoder i LoginContext
er:
Tabel 2. LoginContext-metoder
Log på() | Udfører login, et relativt komplekst trin, der påberåber alle LoginModul s angivet til denne konfiguration. Hvis det lykkes, opretter det en godkendt Emne . Hvis det mislykkes, kaster det et LoginUndtagelse . |
getSubject () | Returnerer det godkendte Emne . |
Log ud() | Logger ud af det godkendte Emne og fjerner dens Rektor s og legitimationsoplysninger. |
Vi viser, hvordan du bruger disse metoder senere.
Godkendelse: LoginModule
LoginModul
er grænsefladen til specifikke godkendelsesmekanismer. J2SE 1.4 leveres med et sæt klar til brug LoginModuler
, herunder:
Tabel 3. LoginModules i J2SE 1.4
JndiLoginModule | Bekræftes mod en katalogtjeneste konfigureret under JNDI (Java Naming and Directory Interface) |
Krb5LoginModule | Autentificerer ved hjælp af Kerberos-protokoller |
NTLoginModule | Bruger den aktuelle brugers NT-sikkerhedsoplysninger til godkendelse |
UnixLoginModule | Bruger den aktuelle brugers Unix-sikkerhedsoplysninger til godkendelse |
Sammen med disse moduler kommer et sæt tilsvarende beton Rektor
implementeringer i com.sun.security.auth
pakke, såsom NTDomainPrincipal
og UnixPrincipal
.
Det LoginModul
interface har fem metoder:
Tabel 4. LoginModule-metoder
initialisere () | Kaldes efter LoginModul er konstrueret. |
| Udfører godkendelsen. |
begå() | Kaldt af LoginContext efter at det har accepteret resultaterne fra alle LoginModul er defineret til denne applikation. Vi tildeler Rektor s og legitimationsoplysninger til Emne her. |
abort() | Kaldes når nogen LoginModul for denne applikation mislykkes (selvom tidligere i rækkefølge muligvis er lykkedes - svarende til en 2PC-model). Ingen Rektor s eller legitimationsoplysninger tildeles til Emne . |
Log ud() | Fjerner Rektor s og legitimationsoplysninger tilknyttet Emne . |
Applikationslaget kalder ingen af disse metoder direkte - den LoginContext
påkalder dem efter behov. Vores eksempel nedenfor vil uddybe implementeringerne af disse metoder.
Godkendelse: CallbackHandlers og Callbacks
CallbackHandler
s og Ring tilbage
s lad en LoginModul
indsamle nødvendige godkendelsesoplysninger fra en bruger eller et system, mens du forbliver uafhængig af den aktuelle interaktionsmekanisme. Vi udnytter denne kapacitet i vores design - vores RdbmsLoginModule
afhænger ikke af, hvordan brugerlegitimationsoplysningerne (brugernavn / adgangskode) opnås og kan således bruges i de forskellige applikationsmiljøer, vi vil illustrere (enten fra kommandolinjen eller fra en JSP).