Už jste někdy potřebovali vytvořit mechanismus ověřování přihlášení pro aplikaci? Kurzy jsou, máte, a pravděpodobně více než jednou, přičemž každá nová implementace je blízká, ale ne identická, s tou předchozí. Například jedna implementace může používat databázi Oracle, jiná může používat ověřování NT a další adresář LDAP (lehký přístupový adresářový protokol). Nebylo by hezké podporovat všechny tyto bezpečnostní mechanismy beze změny kódu na úrovni aplikace?
Nyní ve světě Java můžete pomocí služby Java Authentication and Authorization Service (JAAS). Toto relativně nové API bylo rozšíření v J2SE (Java 2 Platform, Standard Edition) 1.3, je jádrem API v J2SE 1.4 a je také součástí specifikace J2EE (Java 2 Platform, Enterprise Edition) 1.3. V tomto článku vás naučíme základy JAAS a ukážeme vám, jak efektivně aplikovat JAAS na aplikace v reálném světě. Aplikaci tohoto článku jsme založili na našich vlastních zkušenostech s integrací JAAS do existujícího webového systému Java, který pro ukládání přihlašovacích údajů uživatele používal RDBMS (systém správy relační databáze). S JAAS jsme navrhli robustnější, flexibilnější a konzistentnější mechanismy přihlášení a ověřování.
Můžete si stáhnout kompletní sadu pracovních příkladů z níže uvedených zdrojů (zahrnuje zdroje Java, JSP (stránky JavaServer), konfiguraci JAAS s databází a skripty sestavení). Tyto příklady jsme testovali pomocí Resin serveru s JDBC (Java Database Connectivity) a MySQL databáze.
Ověřování a autorizace Java: Celkový obraz
Před JAAS byl bezpečnostní model Javy většinou formován svým původem jako jazyk nezávislý na platformě pro distribuované síťové aplikace. V počátcích se Java často objevovala jako mobilní kód, jako jsou applety založené na prohlížeči, a proto se počáteční model zabezpečení zaměřil na ochranu uživatelů na základě kde kód vznikl a kdo to vytvořil. Rané bezpečnostní mechanismy Java, jako např Bezpečnostní manažer
s, koncept izolovaného prostoru, podepisování kódu a soubory zásad byly určeny k ochraně uživatelů před systémem.
Vynález JAAS odráží vývoj Javy v univerzální programovací jazyk používaný k implementaci tradičních klientských a serverových aplikací, které vyžadují přihlášení a řízení přístupu. JAAS chrání systém před uživateli povolením nebo odepřením přístupu na základě kdo nebo co program spouští. Zatímco JAAS může provádět ověřování i autorizaci, v tomto článku se zaměřujeme především na ověřování.
JAAS může zjednodušit váš vývoj zabezpečení Java tím, že mezi vaši aplikaci vloží abstrakční vrstvu a různorodé základní ověřovací a autorizační mechanismy. Tato nezávislost na platformách a algoritmech vám umožňuje používat různé bezpečnostní mechanismy bez úpravy kódu na úrovni aplikace. Stejně jako u většiny bezpečnostních API Java, dosahuje JAAS této nezávislosti na implementaci prostřednictvím rozšiřitelného rámce rozhraní zásuvných poskytovatelů služeb (SPI): sada abstraktních tříd a rozhraní, pro které jsou vyvíjeny konkrétní implementace.
Obrázek 1 níže poskytuje přehled na vysoké úrovni o tom, jak JAAS dosahuje této připojitelnosti. Váš kód aplikační vrstvy se primárně zabývá a LoginContext
. Pod tím LoginContext
je sada jednoho nebo více dynamicky konfigurovaných Přihlašovací modul
s, které zpracovávají skutečné ověřování pomocí příslušné bezpečnostní infrastruktury.
JAAS poskytuje určité reference Přihlašovací modul
implementace, jako je Modul JndiLogin
; můžete si také vytvořit svůj vlastní, jak to uděláme zde s RdbmsLoginModule
. Ukážeme také, jak můžete rychle nastavit aplikaci s výběrem implementací pomocí jednoduchého konfiguračního souboru.
Kromě toho, že je JAAS zapojitelný, je stohovatelný: v rámci jediného přihlášení se může sada bezpečnostních modulů skládat na sebe, každý je volán v pořadí a každý interaguje s jinou bezpečnostní infrastrukturou.
Aspekty JAAS jsou modelovány na některých známých architektonických vzorcích zabezpečení a existujících rámcích. Funkce stohovatelnosti se například záměrně podobá rámci Unix Pluggable Authentication Module (PAM). Z transakčního hlediska JAAS přijímá chování podobné protokolům dvoufázového potvrzení (2PC). Koncepty konfigurace zabezpečení JAAS, včetně Politika
soubory a Oprávnění
, pocházejí z bezpečnostních balíčků J2SE 1.2. JAAS si také vypůjčuje nápady z jiných zavedených bezpečnostních rámců, jako jsou certifikáty X.509, z nichž název Předmět
je odvozeno (dozvíte se více o Předmět
později).
Poznámka: JAAS je jen jedním z několika nových bezpečnostních API Java. Další informace o zabezpečení Java najdete v postranním panelu „The Java Security Puzzle“ a v níže uvedených zdrojích.
JAAS na straně klienta a serveru
JAAS můžete použít na klientovi i na serveru. Jeho použití na straně klienta je přímé, jak si brzy ukážeme. Na straně serveru se věci stávají o něco složitějšími. V současné době je JAAS na trhu aplikačních serverů trochu nekonzistentní; Servery aplikací J2EE používají JAAS mírně odlišně, podle toho, který používáte. Například JBossSX pomocí své vlastní architektury pěkně integruje JAAS do svého celkového bezpečnostního rámce (který je podrobně popsán v JavaWorld článek „Integrovat bezpečnostní infrastruktury s JBossSX“ (srpen 2001)). Přestože WebLogic 6.x podporuje JAAS, podrobnosti se liší.
Takže můžete pochopit JAAS z pohledu na straně serveru i na straně klienta, v tomto článku si ukážeme příklady obou. A pro zjednodušení na serveru použijeme aplikační server Resin, abychom mohli začít s čistší břidlicí (Resin má vlastní zásuvné ověřovací schéma, ale je to nestandardní, takže použití JAAS nám dává větší přenositelnost možnosti později).
Jádro JAAS
Abyste mohli začít s JAAS, musíte se nejprve ujistit, že je nainstalován. J2SE 1.4 již obsahuje JAAS; J2SE 1.3 není. Pokud chcete i nadále používat J2SE 1.3, stáhněte si JAAS ze Sun Microsystems. Jakmile si stáhnete a nainstalujete JAAS do daného adresáře, uvidíte podadresář s názvem lib
, který obsahuje jeden soubor s názvem jaas.jar
. Tento soubor budete muset přidat do své cesty ke třídě nebo jej zkopírovat do adresáře rozšíření JRE (Java Runtime Environment) (v \ lib \ ext
, kde je umístění vašeho JRE). Pak jste připraveni na JAAS. Poznámka: Pokud používáte aplikační server, může již obsahovat JAAS. Podrobnosti najdete v dokumentaci k serveru.
U některého z těchto přístupů si všimněte, že můžete změnit některá nastavení systémových vlastností souvisejících s JAAS (stejně jako mnoho dalších nastavení zabezpečení Java) v souboru vlastností zabezpečení Java. Tento soubor, java.bezpečnost
, se nachází v / lib / zabezpečení
adresář a zapsán ve standardním formátu souboru vlastností Java.
Použití ověřování JAAS z vaší aplikace obvykle zahrnuje následující kroky:
- Vytvořit
LoginContext
- Volitelně předat a
CallbackHandler
doLoginContext
, pro shromažďování nebo zpracování autentizačních dat - Proveďte ověřování voláním
LoginContext
jepřihlásit se()
metoda - Proveďte privilegované akce pomocí vráceného
Předmět
(za předpokladu úspěšného přihlášení)
Zde je minimální příklad:
LoginContext lc = nový LoginContext ("Můj příklad"); zkuste {lc.login (); } catch (LoginException) {// Ověření se nezdařilo. } // Ověření bylo úspěšné, nyní můžeme pokračovat. // Pokud chceme, můžeme použít vrácený předmět. Předmět sub = lc.getSubject (); Subject.doAs (sub, new MyPrivilegedAction ());
Pod kryty se objevuje několik dalších věcí:
- Během inicializace
LoginContext
najde položku konfigurace„Můj příklad“
v konfiguračním souboru JAAS (který jste nakonfigurovali), abyste zjistili, který z nichPřihlašovací modul
s načíst (viz obrázek 2) - Během přihlášení se
LoginContext
volá každýPřihlašovací modul
jepřihlásit se()
metoda - Každý
přihlásit se()
metoda provádí ověřování nebo získává aCallbackHandler
- The
CallbackHandler
používá jeden nebo víceZpětné volání
s k interakci s uživatelem a shromažďování informací - Nový
Předmět
instance je naplněna podrobnostmi ověřování, jako jeŘeditel školy
sa pověření
Níže vysvětlíme další podrobnosti, ale nejprve se podívejme na klíčové třídy a rozhraní JAAS zapojené do procesu. Ty se obvykle dělí do následujících tří skupin:
Tabulka 1. Třídy a rozhraní JAAS
Běžný | Předmět , Ředitel školy pověření (pověření není žádná konkrétní třída, ale může to být jakýkoli objekt) |
Ověření | LoginContext , Přihlašovací modul , CallbackHandler , Zpětné volání |
Povolení | Politika , AuthPermission , PrivateCredentialPermission |
Většina z těchto tříd a rozhraní je v javax.security.auth
dílčí balíčky balíčku s některými předem připravenými implementacemi v com.sun.security.auth
balíček, zahrnutý pouze v J2SE 1.4.
Poznámka: Protože se v tomto článku zaměříme na ověřování, nebudeme se ponořit do tříd autorizace.
Společné: Subjekty, ředitelé a pověřovací listiny
The Předmět
třída představuje ověřenou entitu: koncového uživatele nebo správce nebo webovou službu, zařízení nebo jiný proces. Třída obsahuje tři sady typů informací o zabezpečení:
- Totožnosti: Ve formě jednoho nebo více
Ředitel školy
s - Veřejné údaje: Například jméno nebo veřejné klíče
- Soukromé údaje: Jako hesla nebo soukromé klíče
Ředitel školy
s představují Předmět
identity. Provádějí java.security.Principal
rozhraní (které předchází JAAS) a java.io. Serializovatelné
. A Předmět
nejdůležitější metoda je getName ()
, který vrací název řetězce identity. Protože a Předmět
instance obsahuje pole Ředitel školy
s, může tedy mít více jmen. Protože číslo sociálního zabezpečení, přihlašovací ID, e-mailová adresa atd., To vše může představovat jednoho uživatele, je v reálném světě více identit běžné.
Posledním prvkem zde, pověření, není třída nebo rozhraní, ale může to být jakýkoli objekt. Pověření mohou zahrnovat jakýkoli artefakt ověřování, například lístek, klíč nebo heslo, který mohou vyžadovat konkrétní systémy zabezpečení. The Předmět
třída udržuje jedinečný Soubor
soukromých a veřejných údajů, které lze načíst pomocí metod, jako je getPrivateCredentials ()
a getPublicCrendentials ()
. Tyto metody používají bezpečnostní subsystémy častěji než na aplikační vrstvě.
Ověření: LoginContext
Vaše aplikační vrstva používá LoginContext
jako primární třída pro autentizaci Předmět
s. LoginContext
také představuje místo, kde vstupuje do hry dynamická připojitelnost JAAS, protože když vytvoříte a LoginContext
, určíte pojmenovanou konfiguraci, která se má načíst. The LoginContext
obvykle načte informace o konfiguraci z textového souboru, což zase řekne LoginContext
který Přihlašovací modul
s použít při přihlášení.
Tři běžně používané metody v LoginContext
jsou:
Tabulka 2. LoginContext metody
přihlásit se() | Provede přihlášení, což je relativně složitý krok, který vyvolá všechny Přihlašovací modul pro tuto konfiguraci je uvedeno. Pokud uspěje, vytvoří ověřený Předmět . Pokud selže, hodí a Přihlašovací výjimka . |
getSubject () | Vrátí ověřený Předmět . |
odhlásit se() | Odhlásí ověřené Předmět a odstraní jeho Ředitel školy sa pověření. |
Ukážeme si, jak tyto metody použít později.
Ověření: LoginModule
Přihlašovací modul
je rozhraní ke konkrétním mechanismům autentizace. J2SE 1.4 se dodává se sadou připravených k použití Přihlašovací moduly
, počítaje v to:
Tabulka 3. LoginModules v J2SE 1.4
Modul JndiLogin | Ověří se proti adresářové službě nakonfigurované v rámci JNDI (Java Naming and Directory Interface) |
Krb5LoginModule | Ověření pomocí protokolů Kerberos |
NTLoginModule | K ověření použije informace o zabezpečení NT aktuálního uživatele |
UnixLoginModule | K ověření použije informace o zabezpečení Unixu aktuálního uživatele |
Spolu s těmito moduly přichází sada odpovídajícího betonu Ředitel školy
implementace v com.sun.security.auth
balíček, jako je NTDomainPrincipal
a UnixPrincipal
.
The Přihlašovací modul
rozhraní má pět metod:
Tabulka 4. Metody LoginModule
inicializovat () | Volal po Přihlašovací modul je postaven. |
| Provede ověření. |
spáchat() | Volal LoginContext poté, co přijme výsledky od všech Přihlašovací modul jsou definovány pro tuto aplikaci. Přiřadíme Ředitel školy sa pověření k Předmět tady. |
přerušit() | Volal, když existuje Přihlašovací modul pro tuto aplikaci selže (i když ty starší v pořadí mohly uspět - tedy podobné jako u modelu 2PC). Ne Ředitel školy s nebo pověření jsou přiřazena k Předmět . |
odhlásit se() | Odstraní Ředitel školy sa pověření spojená s Předmět . |
Aplikační vrstva žádnou z těchto metod přímo nevolá - the LoginContext
podle potřeby je vyvolá. Náš příklad níže se bude zabývat implementacemi těchto metod.
Ověření: CallbackHandlers a zpětná volání
CallbackHandler
s a Zpětné volání
necháme a Přihlašovací modul
shromažďovat potřebné ověřovací informace od uživatele nebo systému, přičemž zůstávají nezávislé na skutečném mechanismu interakce. Tuto schopnost využijeme v našem designu - našem RdbmsLoginModule
Nezáleží na tom, jak jsou získána pověření uživatele (uživatelské jméno / heslo), a lze je tedy použít v různých aplikačních prostředích, která ilustrujeme (buď z příkazového řádku nebo z JSP).