Programmering

Alt det JAAS

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 SecurityManagers, 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 LoginModuls, 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:

  1. Lave en LoginContext
  2. Valgfrit bestå en CallbackHandler til LoginContexttil indsamling eller behandling af godkendelsesdata
  3. Udfør godkendelse ved at ringe til LoginContext's Log på() metode
  4. 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:

  1. Under initialiseringen LoginContext finder konfigurationsindgangen "Mit eksempel" i en JAAS-konfigurationsfil (som du konfigurerede) for at bestemme hvilken LoginModuls at indlæse (se figur 2)
  2. Under login, LoginContext kalder hver LoginModul's Log på() metode
  3. Hver Log på() metoden udfører godkendelsen eller hverver en CallbackHandler
  4. Det CallbackHandler bruger en eller flere Ring tilbages til at interagere med brugeren og samle input
  5. Et nyt Emne forekomst er befolket med godkendelsesdetaljer såsom Rektors 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

almindeligeEmne, Rektor, legitimationsoplysninger (legitimationsoplysninger er ikke nogen bestemt klasse, men kan være et hvilket som helst objekt)
GodkendelseLoginContext, LoginModul, CallbackHandler, Ring tilbage
BemyndigelsePolitik, 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 Rektors
  • Offentlige legitimationsoplysninger: Såsom navn eller offentlige nøgler
  • Private legitimationsoplysninger: Ligesom adgangskoder eller private nøgler

Rektors 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 Rektors, 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æts 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 Emnes. 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 LoginModuls 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 LoginModuls 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 Rektors 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

JndiLoginModuleBekræftes mod en katalogtjeneste konfigureret under JNDI (Java Naming and Directory Interface)
Krb5LoginModuleAutentificerer ved hjælp af Kerberos-protokoller
NTLoginModuleBruger den aktuelle brugers NT-sikkerhedsoplysninger til godkendelse
UnixLoginModuleBruger 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.
Log på()Udfører godkendelsen.
begå()Kaldt af LoginContext efter at det har accepteret resultaterne fra alle LoginModuler defineret til denne applikation. Vi tildeler Rektors 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 Rektors eller legitimationsoplysninger tildeles til Emne.
Log ud()Fjerner Rektors 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

CallbackHandlers og Ring tilbages 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).