Útmutató a Java hitelesítési és hitelesítési szolgáltatáshoz (JAAS)

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

A Java Authentication And Authorization Service (JAAS) egy Java SE alacsony szintű biztonsági keretrendszer, amely kibővíti a biztonsági modellt a kód alapú biztonságtól a felhasználó alapú biztonságig. Két célra használhatjuk a JAAS-t:

  • Hitelesítés: A kódot futtató entitás azonosítása
  • Engedélyezés: A hitelesítést követően győződjön meg arról, hogy az entitás rendelkezik a szükséges hozzáférés-ellenőrzési jogokkal vagy engedélyekkel az érzékeny kód futtatásához

Ebben az oktatóanyagban kitérünk arra, hogyan állíthatjuk be a JAAS-t egy minta alkalmazásban a különböző API-k, különösen a LoginModule.

2. Hogyan működik a JAAS

Ha a JAAS-t egy alkalmazásban használja, több API is részt vesz:

  • CallbackHandler: Felhasználói adatok gyűjtésére szolgál, és opcionálisan megadható a LoginContext
  • Konfiguráció: Felelős a rakodásért LoginModule megvalósítások, és opcionálisan a LoginContext Teremtés
  • LoginModule: Hatékonyan használják a felhasználók hitelesítésére

Az alapértelmezett megvalósítást fogjuk használni a Konfiguráció API-t és saját megvalósításokat biztosítunk a CallbackHandler és a LoginModule API-k.

3. Gondoskodás CallbackHandler Végrehajtás

Mielőtt belemélyedne a LoginModule megvalósításának előbb meg kell tennünk megvalósítás biztosítása a CallbackHandler felület, amelyet a felhasználói hitelesítő adatok gyűjtésére használnak.

Egyetlen módszere van, fogantyú(), amely elfogadja a Visszahívs. Ezenkívül a JAAS már sokakat nyújt Visszahív megvalósításokat, és mi a NameCallback és PasswordCallback a felhasználónév és a jelszó összegyűjtéséhez.

Lássuk a CallbackHandler felület:

public class ConsoleCallbackHandler végrehajtja a CallbackHandler {@Orride public void hand (Callback [] visszahívások) dobja az UnsupportedCallbackException {Console console = System.console (); a (Visszahívás visszahívás: visszahívások) esetén {if (a NameCallback visszahívási példánya) {NameCallback nameCallback = (NévHívás) visszahívás; nameCallback.setName (konzol.readLine (névCallback.getPrompt ())); } else if (a CallCallback visszahívási példánya) {PasswordCallback passwordCallback = (PasswordCallback) visszahívás; passwordCallback.setPassword (konzol.readPassword (passwordCallback.getPrompt ())); } else {dobjon új UnsupportedCallbackException (visszahívás); }}}}

Tehát a felhasználónév megkérésére és elolvasására a következőket használtuk:

NameCallback nameCallback = (NameCallback) visszahívás; nameCallback.setName (konzol.readLine (névCallback.getPrompt ()));

Hasonlóképpen, a jelszó kérésére és elolvasására:

PasswordCallback passwordCallback = (PasswordCallback) visszahívás; passwordCallback.setPassword (konzol.readPassword (passwordCallback.getPrompt ()));

Később meglátjuk, hogyan hívjuk a CallbackHandler végrehajtásakor LoginModule.

4. Biztosítás LoginModule Végrehajtás

Az egyszerűség kedvéért olyan megoldást kínálunk, amely tárolja a kódolt felhasználókat. Tehát hívjuk InMemoryLoginModule:

public class InMemoryLoginModule megvalósítja a LoginModule {private static final String USERNAME = "testuser"; privát statikus végső karakterlánc PASSWORD = "tesztjelszó"; magán tantárgy tantárgy; privát CallbackHandler callbackHandler; saját térkép sharedState; privát Térkép opciók; privát logikai bejelentkezésSikerült = hamis; magánfőnök userprincipal; // ...}

A következő alfejezetekben a fontosabb módszerek megvalósítását adjuk meg: inicializálás (), Belépés(), és elkövetni().

4.1. inicializálás ()

A LoginModule először betöltődik, majd inicializálja a Tantárgy és a CallbackHandler. Ezenkívül LoginModules használhatja a Térkép az adatok megosztására egymás között, és egy másik Térkép privát konfigurációs adatok tárolásához:

public void inicializálás (Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) {this.subject = subject; this.callbackHandler = callbackHandler; this.sharedState = sharedState; this.options = opciók; }

4.2. Belépés()

Ban,-ben Belépés() módszerrel meghívjuk a CallbackHandler.handle () módszer a NameCallback és a PasswordCallback hogy megkérdezze és megkapja a felhasználónevet és a jelszót. Ezután összehasonlítjuk ezeket a megadott hitelesítő adatokat a kemény kódolásúakkal:

@A nyilvános logikai bejelentkezés felülbírálása () dobja a LoginException {NameCallback nameCallback = new NameCallback ("felhasználónév:"); PasswordCallback passwordCallback = új PasswordCallback ("jelszó:", hamis); próbálja meg a {callbackHandler.handle (új visszahívás [] {nameCallback, passwordCallback}); Karakterlánc felhasználónév = névCallback.getName (); String jelszó = új karakterlánc (passwordCallback.getPassword ()); if (USERNAME.equals (felhasználónév) && PASSWORD.equals (jelszó)) {loginSucceeded = true; }} catch (IOException | UnsupportedCallbackException e) {// ...} return bejelentkezésSikerült; }

A Belépés() módszernek vissza kell térnie igaz a sikeres működéshez és hamis sikertelen bejelentkezéshez.

4.3. elkövetni()

Ha minden hív Bejelentkezés # modul bejelentkezés sikerül, mi frissítse a Tantárgy egy kiegészítővel :

@A nyilvános logikai elkötelezettség felülbírálása () dobja a LoginException {if (! LoginSucceeded) {return false; } userPrincipal = új UserPrincipal (felhasználónév); subject.getPrincipals (). add (userPrincipal); return true; }

Egyébként a elvetél() módszert nevezzük.

Ezen a ponton a mi LoginModule a megvalósítás készen áll és konfigurálandó, hogy dinamikusan tölthető legyen a Konfiguráció Szolgáltató.

5. LoginModule Konfiguráció

A JAAS a Konfiguráció szolgáltató betölteni LoginModules futás közben. Alapértelmezés szerint biztosítja és használja a ConfigFile megvalósítás hol LoginModules egy bejelentkezési fájlon keresztül konfigurálhatók. Például itt van a fájlunk tartalma LoginModule:

jaasApplication {com.baeldung.jaas.loginmodule.InMemoryLoginModule szükséges debug = true; };

Ahogy látjuk, megadtuk a. osztály teljes nevét LoginModule végrehajtás, a kívánt flag, és egy lehetőség a hibakeresésre.

Végül vegye figyelembe, hogy a bejelentkezési fájlt a java.security.auth.login.config rendszer tulajdonság:

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

A tulajdonságon keresztül megadhatunk egy vagy több bejelentkezési fájlt is login.config.url a Java biztonsági fájlban, $ {java.home} /jre/lib/security/java.security:

login.config.url.1 = fájl: $ {user.home} /. java.login.config

6. Hitelesítés

Először, egy alkalmazás inicializálja a hitelesítési folyamatot a LoginContext példa. Ehhez megnézhetjük a teljes kivitelezőt, hogy képet kapjunk arról, hogy mire van szükségünk paraméterként:

LoginContext (Karakterlánc neve, Tárgy tárgya, Visszahívás Kezelő visszahívás Kezelő, Konfigurációs konfiguráció)
  • név: indexként használják csak a megfelelő betöltésére LoginModules
  • tantárgy: egy felhasználót vagy szolgáltatást jelent, amely bejelentkezni szeretne
  • callbackHandler: felelős a felhasználói hitelesítő adatok továbbításáért az alkalmazásból az LoginModule
  • konfig: felelős a rakodásért LoginModuleamelyek megfelelnek a névparaméternek

Itt a túlterhelt kivitelezőt fogjuk használni, ahol megadjuk CallbackHandler végrehajtás:

LoginContext (karakterlánc neve, CallbackHandler callbackHandler)

Most, hogy van egy CallbackHandler és egy konfigurált LoginModule, a hitelesítési folyamatot az a inicializálásával indíthatjuk el LoginContext tárgy:

LoginContext loginContext = new LoginContext ("jaasApplication", új ConsoleCallbackHandler ());

Ezen a ponton, meghívhatjuk a Belépés() módszer a felhasználó hitelesítésére:

loginContext.login ();

A Belépés() módszer viszont új példányunkat hozza létre LoginModule és felhívja annak Belépés() módszer. És, sikeres hitelesítés után visszakereshetjük a hitelesítetteket Tantárgy:

Subject subject = loginContext.getSubject ();

Most futtassunk egy példa alkalmazást, amely rendelkezik a LoginModule bekötve:

$ mvn tiszta csomag com.baeldung.jaas.JaasAuthentication

Amikor a rendszer megkéri, hogy adja meg a felhasználónevet és a jelszót, akkor felhasználjuk testuser és tesztjelszó mint megbízólevél.

7. Engedélyezés

A jogosultság akkor lép életbe, amikor a felhasználó először csatlakozik és társul a AccessControlContext. A Java biztonsági házirendjének használatával egy vagy több hozzáférés-vezérlési jogot megadhatunk ezeknek s. Ezután megakadályozhatjuk az érzékeny kód elérését a SecurityManager # checkPermission módszer:

SecurityManager.checkPermission (Engedély engedély)

7.1. Engedélyek meghatározása

Beléptető jog vagy Az engedély egy erőforrás művelet végrehajtásának képessége. Engedélyt úgy valósíthatunk meg, hogy a Engedély absztrakt osztály. Ehhez meg kell adnunk egy erőforrás nevét és egy sor lehetséges műveletet. Például használhatjuk FilePermission a fájlok hozzáférés-vezérlési jogainak konfigurálásához. Lehetséges cselekedetek olvas, ír, végrehajtani, stb. Azokban a forgatókönyvekben, ahol nincs szükség műveletekre, egyszerűen a BasicPermision.

Ezután az engedélyen keresztül megvalósítjuk az engedélyt ResourcePermission osztály, ahol a felhasználók jogosultak lehetnek az erőforrások elérésére:

public final osztály ResourcePermission kiterjeszti a BasicPermission {public ResourcePermission (karakterlánc neve) {super (név); }}

Később a Java biztonsági házirendjén keresztül konfigurálunk egy bejegyzést ehhez az engedélyhez.

7.2. Engedélyek megadása

Általában nincs szükségünk a házirendfájl szintaxisára, mert mindig létrehozhatjuk a Házirend eszközt. Vessünk egy pillantást az irányelveinkre:

megadja a com.sun.security.auth.UserPrincipal testuser {engedély com.baeldung.jaas.ResourcePermission "test_resource"} engedélyt;

Ebben a mintában megadtuk a teszt_forrás engedély a testuser felhasználó.

7.3. Engedélyek ellenőrzése

Egyszer a Tantárgy hitelesített és az engedélyek konfigurálva vannak, ellenőrizhetjük a hozzáférést a Tárgy # doAs vagy Subject # doAsPrivilieged statikus módszerek. Erre a célra megadjuk a PrivilegedAction ahol megvédhetjük az érzékeny kódhoz való hozzáférést. Ban,-ben fuss() módszerrel hívjuk SecurityManager # checkPermission módszer annak biztosítására, hogy a hitelesített felhasználó rendelkezik a teszt_forrás engedély:

public class ResourceAction implementálja a PrivilegedAction {@Orride public Object run () {SecurityManager sm = System.getSecurityManager (); if (sm! = null) {sm.checkPermission (új ResourcePermission ("teszt_forrás")); } System.out.println ("Hozzáférem a teszt_forráshoz!"); return null; }}

Az utolsó dolog a Subject # doAsPrivileged módszer:

Subject subject = loginContext.getSubject (); PrivilegedAction privilegedAction = új ResourceAction (); Subject.doAsPrivileged (subject, privilegedAction, null);

A hitelesítéshez hasonlóan egy egyszerű alkalmazást is futtatunk az engedélyezéshez, ahol a LoginModule, engedélyek konfigurációs fájlt adunk meg:

$ mvn tiszta csomag $ 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. Következtetés

Ebben a cikkben bemutattuk, hogyan lehet megvalósítani a JAAS-t azáltal, hogy feltárjuk a főbb osztályokat és interfészeket, és bemutatjuk, hogyan kell konfigurálni őket. Különösen szolgáltatót vezettünk be LoginModule.

Szokás szerint a cikk kódja elérhető a GitHubon.

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT