Sprievodca službou Java Authentication And Authorization Service (JAAS)

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

Java Authentication And Authorization Service (JAAS) je Java SE nízkoúrovňový bezpečnostný rámec, ktorý rozširuje bezpečnostný model od bezpečnosti podľa kódu až po bezpečnosť používateľa. JAAS môžeme použiť na dva účely:

  • Autentifikácia: Identifikácia entity, ktorá momentálne spúšťa kód
  • Autorizácia: Po overení sa uistite, že táto entita má požadované práva alebo povolenia na riadenie prístupu na vykonávanie citlivého kódu

V tomto výučbe sa dozvieme, ako nastaviť JAAS vo vzorovej aplikácii implementáciou a konfiguráciou jej rôznych rozhraní API, najmä Prihlasovací modul.

2. Ako funguje JAAS

Pri použití JAAS v aplikácii je zapojených niekoľko API:

  • CallbackHandler: Používa sa na zhromažďovanie prihlasovacích údajov používateľa a voliteľne sa poskytuje pri vytváraní súboru LoginContext
  • Konfigurácia: Zodpovedá za načítanie Prihlasovací modul implementácie a môžu byť voliteľne poskytované na LoginContext stvorenie
  • Prihlasovací modul: Účinne sa používa na autentifikáciu používateľov

Použijeme predvolenú implementáciu pre Konfigurácia API a poskytovať naše vlastné implementácie pre CallbackHandler a Prihlasovací modul API.

3. Poskytovanie CallbackHandler Implementácia

Pred kopaním do Prihlasovací modul implementáciu, musíme najskôr zabezpečiť implementáciu pre CallbackHandler rozhranie, ktoré sa používa na zhromažďovanie prihlasovacích údajov používateľa.

Má to jedinú metódu, rukoväť (), ktorý prijíma pole Zavolaj späťs. Okrem toho JAAS už poskytuje mnoho Zavolaj späť implementácie a budeme používať NameCallback a PasswordCallback na získanie používateľského mena a hesla.

Pozrime sa na našu implementáciu CallbackHandler rozhranie:

public class ConsoleCallbackHandler implementuje CallbackHandler {@Override public void handle (Callback [] callbacks) hodí UnsupportedCallbackException {Console console = System.console (); for (Callback callback: callbacks) {if (callback instanceof NameCallback) {NameCallback nameCallback = (NameCallback) callback; nameCallback.setName (console.readLine (nameCallback.getPrompt ())); } else if (callback instanceof PasswordCallback) {PasswordCallback passwordCallback = (PasswordCallback) callback; hesloCallback.setPassword (console.readPassword (hesloCallback.getPrompt ())); } else {hodit novu UnsupportedCallbackException (callback); }}}}

Na výzvu a prečítanie používateľského mena sme teda použili:

NameCallback nameCallback = (NameCallback) spätné volanie; nameCallback.setName (console.readLine (nameCallback.getPrompt ()));

Podobne, ak chcete zobraziť a prečítať heslo:

PasswordCallback passwordCallback = (PasswordCallback) spätné volanie; hesloCallback.setPassword (console.readPassword (hesloCallback.getPrompt ()));

Neskôr uvidíme, ako zavolať na CallbackHandler pri implementácii Prihlasovací modul.

4. Poskytovanie Prihlasovací modul Implementácia

Pre jednoduchosť poskytneme implementáciu, ktorá ukladá pevne zakódovaných používateľov. Takže, nazvime to Modul InMemoryLoginModule:

verejná trieda InMemoryLoginModule implementuje LoginModule {private static final String USERNAME = "testuser"; private static final String PASSWORD = "testpassword"; súkromný predmet; súkromný CallbackHandler callbackHandler; súkromná mapa sharedState; možnosti súkromnej mapy; private boolean loginSucceeded = false; súkromný hlavný užívateľPrincipal; // ...}

V nasledujúcich podkapitolách uvedieme implementáciu dôležitejších metód: inicializovať (), Prihlásiť sa()a spáchať ().

4.1. inicializovať ()

The Prihlasovací modul sa najskôr načíta a potom inicializuje pomocou Predmet a a CallbackHandler. Navyše, Prihlasovací moduls môže použiť a Mapa na vzájomné zdieľanie údajov a iné Mapa na ukladanie súkromných konfiguračných údajov:

public void initialize (predmet subjektu, CallbackHandler callbackHandler, mapa sharedState, možnosti mapy) {this.subject = subject; this.callbackHandler = callbackHandler; this.sharedState = sharedState; this.options = možnosti; }

4.2. Prihlásiť sa()

V Prihlásiť sa() metóda, vyvoláme CallbackHandler.handle () metóda s a NameCallback a a PasswordCallback na výzvu a získanie používateľského mena a hesla. Potom porovnáme tieto poskytnuté poverenia s pevne zakódovanými:

@Override public boolean login () vyvolá LoginException {NameCallback nameCallback = nové NameCallback ("username:"); PasswordCallback passwordCallback = nové PasswordCallback ("heslo:", nepravdivé); try {callbackHandler.handle (new Callback [] {nameCallback, passwordCallback}); Reťazec username = nameCallback.getName (); Reťazcové heslo = nový Reťazec (passwordCallback.getPassword ()); if (USERNAME.equals (meno používateľa) && PASSWORD.equals (heslo)) {loginSucceeded = true; }} chytit (IOException | UnsupportedCallbackException e) {// ...} vrátiť loginSucceeded; }

The Prihlásiť sa() metóda by sa mala vrátiť pravda za úspešnú operáciu a nepravdivé pre neúspešné prihlásenie.

4.3. spáchať ()

Ak všetky hovory na LoginModule # login uspejeme, my aktualizovať Predmet s dodatočnou Principal:

@Override public boolean commit () hodí LoginException {if (! LoginSucceeded) {return false; } userPrincipal = nový UserPrincipal (meno používateľa); subject.getPrincipals (). add (userPrincipal); návrat pravdivý; }

Inak by prerušiť () metóda sa volá.

V tomto okamihu náš Prihlasovací modul implementácia je pripravená a je potrebné ju nakonfigurovať tak, aby sa dala dynamicky načítať pomocou Konfigurácia poskytovateľ služieb.

5. Prihlasovací modul Konfigurácia

JAAS používa Konfigurácia poskytovateľ služieb načítať Prihlasovací moduls za behu. V predvolenom nastavení poskytuje a používa ConfigFile implementácia kde Prihlasovací modulsú konfigurované prostredníctvom prihlasovacieho súboru. Tu je napríklad obsah súboru použitého pre naše Prihlasovací modul:

jaasApplication {com.baeldung.jaas.loginmodule.InMemoryLoginModule required debug = true; };

Ako vidíme, poskytli sme plne kvalifikovaný názov triedy Prihlasovací modul implementácia, a požadovaný príznak a možnosť ladenia.

Na záver upozorňujeme, že prihlasovací súbor môžeme určiť aj prostredníctvom súboru java.security.auth.login.config vlastnosť systému:

$ java -Djava.security.auth.login.config = src / main / resources / jaas / jaas.login.config

Prostredníctvom vlastnosti môžeme určiť aj jeden alebo viac prihlasovacích súborov login.config.url v bezpečnostnom súbore Java, $ {java.home} /jre/lib/security/java.security:

login.config.url.1 = súbor: $ {user.home} /. java.login.config

6. Autentifikácia

Po prvé, aplikácia inicializuje proces autentifikácie vytvorením a LoginContext inštancia. Aby sme to mohli urobiť, môžeme sa pozrieť na celého konštruktora a získať tak predstavu o tom, čo potrebujeme ako parametre:

LoginContext (názov reťazca, predmet predmetu, CallbackHandler callbackHandler, konfiguračná konfigurácia)
  • názov: používa sa ako index na načítanie iba zodpovedajúcich Prihlasovací moduls
  • predmet: predstavuje používateľa alebo službu, ktorá sa chce prihlásiť
  • callbackHandler: zodpovedný za prenos poverení používateľa z aplikácie do servera Prihlasovací modul
  • konfigur: zodpovedný za nakládku Prihlasovací moduls, ktoré zodpovedajú parametru mena

Tu použijeme preťažený konštruktor, kde poskytneme náš CallbackHandler implementácia:

LoginContext (názov reťazca, CallbackHandler callbackHandler)

Teraz, keď máme CallbackHandler a nakonfigurovaný Prihlasovací modul, môžeme zahájiť proces autentifikácie inicializáciou a LoginContext objekt:

LoginContext loginContext = nový LoginContext ("jaasApplication", nový ConsoleCallbackHandler ());

V tejto chvíli môžeme vyvolať Prihlásiť sa() spôsob autentifikácie používateľa:

loginContext.login ();

The Prihlásiť sa() metóda zase vytvára našu novú inštanciu Prihlasovací modul a volá jeho Prihlásiť sa() metóda. A po úspešnej autentifikácii môžeme autentifikáciu získať Predmet:

Predmet predmet = loginContext.getSubject ();

Poďme teraz spustiť ukážkovú aplikáciu, ktorá má Prihlasovací modul káblové pripojenie v:

$ mvn čistý balíček $ java -Djava.security.auth.login.config = src / main / resources / jaas / jaas.login.config \ -classpath target / core-java-security-2-0.1.0-SNAPSHOT.jar com.baeldung.jaas.JaasAuthentication

Keď sa zobrazí výzva na zadanie používateľského mena a hesla, použijeme ich testuser a testovacie heslo ako poverovacie listiny.

7. Povolenie

Autorizácia vstupuje do hry, keď je používateľ prvýkrát pripojený a pridružený k AccessControlContext. Pomocou bezpečnostnej politiky Java môžeme jednému alebo viacerým udeliť práva na kontrolu prístupu Principals. Potom môžeme zabrániť prístupu k citlivému kódu zavolaním na SecurityManager # checkPermission metóda:

SecurityManager.checkPermission (povolenie na povolenie)

7.1. Definovanie povolení

Právo na kontrolu prístupu alebo povolenie je schopnosť vykonať akciu na prostriedku. Povolenie môžeme implementovať podtriedou Povolenie abstraktná trieda. Aby sme to dosiahli, musíme uviesť názov zdroja a súbor možných akcií. Napríklad môžeme použiť FilePermission nakonfigurovať prístupové práva k súborom. Možné kroky sú čítať, napíš, vykonať, a tak ďalej. V prípade scenárov, keď nie sú potrebné opatrenia, môžeme jednoducho použiť BasicPermision.

Ďalej zabezpečíme implementáciu povolení prostredníctvom ResourcePermission trieda, kde môžu mať používatelia povolenie na prístup k prostriedku:

public final class ResourcePermission extends BasicPermission {public ResourcePermission (String name) {super (name); }}

Neskôr nakonfigurujeme položku pre toto povolenie prostredníctvom bezpečnostnej politiky Java.

7.2. Udeľovanie povolení

Zvyčajne nepotrebujeme poznať syntax súboru zásad, pretože na ich vytvorenie môžeme kedykoľvek použiť nástroj Policy Tool. Pozrime sa na náš súbor s pravidlami:

udeliť principál com.sun.security.auth.UserPrincipal testuser {povolenie com.baeldung.jaas.ResourcePermission "test_resource"};

V tejto vzorke udelili sme test_zdroj povolenie do testuser používateľ.

7.3. Kontrola povolení

Raz Predmet je autentifikovaný a sú nakonfigurované povolenia, môžeme skontrolovať prístup volaním na Predmet # doAs alebo Predmet # doAsPrivilieged statické metódy. Za týmto účelom poskytneme a PrivilegedAction kde môžeme chrániť prístup k citlivému kódu. V run () metóda, hovoríme SecurityManager # checkPermission metóda na zabezpečenie toho, že autentifikovaný užívateľ má test_zdroj povolenie:

verejná trieda ResourceAction implementuje PrivilegedAction {@Override public Object run () {SecurityManager sm = System.getSecurityManager (); if (sm! = null) {sm.checkPermission (new ResourcePermission ("test_resource")); } System.out.println ("Mám prístup k test_resource!"); návrat null; }}

Posledná vec je zavolať Predmet # doAsPrivileged metóda:

Predmet predmet = loginContext.getSubject (); PrivilegedAction privilegedAction = new ResourceAction (); Subject.doAsPrivileged (subject, privilegedAction, null);

Rovnako ako autentifikácia, aj my spustíme jednoduchú aplikáciu na autorizáciu, kde okrem Prihlasovací modul, poskytujeme konfiguračný súbor povolení:

$ mvn čistý balík $ java -Djava.security.manager -Djava.security.policy = src / main / resources / jaas / jaas.policy \ -Djava.security.auth.login.config = src / main / resources / jaas / jaas.login.config \ -classpath target / core-java-security-2-0.1.0-SNAPSHOT.jar com.baeldung.jaas.JaasAuthorization

8. Záver

V tomto článku sme predviedli, ako implementovať JAAS, preskúmaním hlavných tried a rozhraní a ukážkou, ako ich nakonfigurovať. Špeciálne sme implementovali poskytovateľa služieb Prihlasovací modul.

Ako obvykle je kód v tomto článku k dispozícii na GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found