Java Servlets – autorizovaný prístup k aplikácii 4.

12. února 2004

V tomto článku sa pozrieme bližšie na ďalšie typy realmov. Pre zopakovanie, realm je skupina informácií o užívateľoch a ich roliach. Podľa toho, kde fyzicky sa tieto informácie nachádzajú, rozdeľujeme aj jednotlivé realmy. V minulom článku sme využili MemoryRealm, tentoraz ešte k nemu doplním niektoré informácie.

V minulom článku sme si tiež ukázali ako vôbec aktivovať daný realm. Ak si spomeniete, je nutné vložiť do súboru server.xml na niektoré z troch rôznych miest (<Engine>, <Host> alebo <Context>) nový element s názvom <Realm>. Každý realm má určitý počet atribútov, ktorých význam si vysvetlíme ďalej.

MemoryRealm

Ako som už spomenul, MemoryRealm je najjednoduchší typ realmu, kedy sa informácie o užívateľoch uchovávajú v pamäti ako objekt. Povedal som tiež, že nie je vhodný pre produkčné prostredie, kde sa očakáva veľký počet užívateľov a často sa meniace prístupové údaje. Problém je totiž aj v tom, že každá zmena v súbore tomcat-users.xml sa prejaví až po reštarte servera. Na testovanie možností však postačuje.

Element <Realm> akceptuje tieto atribúty:

  • className
    – tento atribút je povinný a musí obsahovať plne kvalifikované meno daného realmu. V tomto prípade to musí byť org.apache.catalina.realm.MemoryRealm.
  • debug
    – atribút nastavuje mieru detailov logovacieho súboru asociovaného s daným realmom. Čím vyššie číslo, tým viac detailov. Atribút je nepovinný, defaultná hodnota je nula.
  • digest
    – môže obsahovať názov algoritmu použitého na šifrovanie hesiel. Akceptovateľný názov je ten, ktorý vyhovuje podmienkam triedy java.security.MessageDigest, konkrétne ide o SHA, MD2, alebo MD5. Atribút je nepovinný.
  • pathname
    – obsahuje absolútnu alebo relatívnu cestu k XML dokumentu obsahujúcemu užívateľské mená, heslá a jednotlivé názvy rolí. Ak atribút nepoužijete, vezme sa štandardná hodnota conf/tomcat-users.xml.

Čo sa týka súboru s užívateľskými informáciami, môžete použiť vlastný súbor, musí však spĺňať predpísané pravidlá. Musí to byť XML dokument s rovnakou štruktúrou, ako mal ten uvedený v minulom článku. Teraz trochu teórie k tomu ako vlastne tento realm funguje. Keď užívateľ prvýkrát požiada o chránený zdroj, Tomcat 5.x zavolá metódu authenticate() triedy MemoryRealm. Ak sa použije BASIC autentifikácia, klientovi sa odošle status kód SC_UNAUTHORIZED.

Po vyplnení autentifikačných údajov užívateľom sa získané údaje porovnajú s uloženými (napríklad v tomcat-users.xml) a v prípade zhody prebehne proces autentifikácie. To znamená, že sa overí, či daný užívateľ má právo (vlastní „rolu“ ktorá má právo) požiadať o prístup k danej aplikácii, respektíve či má právo zavolať konkrétnu metódu (napríklad GET). Pri FORM autentifikácii sa získané informácie uložia len po dobu trvania session, pri jej ukončení sa stratia. Pri BASIC autentifikácii sa prihlasovacie údaje stratia až po zatvorení browsera.

Debugovacie a chybové záznamy odchytené týmto realmom sa zapisujú do adresára v závislosti od nastavenia elementu Logger asociovaného s elementmi Engine, Host alebo Context. Defaultná hodnota je adresár /logs.

Ako by teda mohol vyzerať element <Realm> v plnej konfigurácii? Nasledovne:

<Realm className = „org.apache.catalina.realm.MemoryRealm“
    debug = „99“
    digest = „MD5“
    pathname = „conf/securapp-users.xml „/>

Schéma fungovania MemoryRealmu

JDBCRealm

JDBCRealm je typ realmu, ktorý predpokladá, že užívateľské informácie sú uložené v relačnej databáze prístupnej cez JDBC driver. Tento realm môže byť použitý na už existujúcu databázu užívateľov a ich rolí, tá však musí spĺňať niekoľko jednoduchých pravidiel. Musí obsahovať tabuľku, v ktorej jednotlivé záznamy predstavujú jednoznačnú informáciu o užívateľoch. Konkrétne musí obsahovať aspoň dva stĺpce, kde jeden predstavuje užívateľské meno a druhý heslo (v čistej podobe alebo šifrované). Ďalej musí obsahovať tabuľku, kde riadky sú nositeľmi informácií o priradených roliach jednotlivým užívateľom. Rovnako musí obsahovať aspoň dva stĺpce. Jeden predstavuje užívateľské meno a druhý obsahuje žiadnu, jednu alebo viac priradených rolí oddelených čiarkou.

Aby ste mohli využívať tento realm, je nutné vykonať niekoľko krokov, ktoré sú takmer totožné ako pri MemoryRealme. Na rozdiel od neho však treba do adresára server/lib (ak chcete, aby bol dostupný len pre server) alebo do adresára common/lib (ak má byť dostupný pre server aj pre vaše aplikácie) nakopírovať správny JDBC driver. Akceptujú sa len drivery s koncovkou *.jar. Aj tento typ realmu má svoje atribúty, pričom tie sú totožné s predchádzajúcim (s výnimkou pathname) a zároveň má aj vlastné typy. Ich význam uvádzam nižšie:

  • className
    – v tomto prípade musí obsahovať org.apache.catalina.realm.JDBCRealm.
  • connectionName
    – užívateľské meno potrebné na pripojenie k databáze.
  • connectionPassword
    – heslo potrebné na pripojenie k databáze.
  • connectionURL
    – URL potrebné na pripojenie k databáze.
  • driverName
    – plne kvalifikovaný názov triedy JDBC drivera.
  • userTable
    – názov autentifikačnej tabuľky obsahujúcej užívateľské mená a heslá.
  • userRoleTable
    – názov autentifikačnej tabuľky obsahujúcej užívateľské mená a k nim priradené role.
  • userNameCol
    – názov stĺpca v oboch autentifikačných tabuľkách obsahujúci užívateľské meno.
  • userCredCol
    – názov stĺpca v autentifikačnej tabuľke obsahujúci užívateľské heslá.
  • roleNameCol
    – názov stĺpca v autentifikačnej tabuľke obsahujúci názvy rolí priradených k menám.

Element <Realm> môže ešte obsahovať atribúty debug a digest, ale ich význam a obsah je totožný s predchádzajúcim realmom. Aj princíp fungovania JDBCRealmu je v jadre totožný s MemoryRealmom. Veľkou výhodou však je to (aj preto ho už možno nasadiť v produkčnom prostredí), že pri každej zmene užívateľských informácií a prístupových práv nie je nutné reštartovať Tomcat. Ale pozor! Každá zmena užívateľských informácií týkajúcich sa už prihláseného užívateľa, sa prejaví až pri jeho ďalšom prihlásení.

Schéma fungovania JDBCRealmu

Na koniec si ešte ukážme príklad plne nastaveného JDBCRealmu prepojeného s databázou Oracle:

<Realm className = „org.apache.catalina.realm.JDBCRealm“
    debug = „99“ driverName = „oracle.jdbc.driver.OracleDriver“
    connectionURL = „jdbc:oracle:thin:@ntserver:1521:ORCL“
    connectionName = „scott“ connectionPassword = „tiger“
    userTable = „users“ userNameCol = „user_name“
    userCredCol = „user_pass“ roleNameCol = „role_name“
    userRoleTable = „user_roles“ />

DataSourceRealm

DataSourceRealm je typ realmu navlas podobný JDBCRealmu. To, čo ich odlišuje, spočíva v odlišnom prístupe k tvorbe a využívaniu databázových spojení, potrebných na overenie faktov týkajúcich sa jednotlivých užívateľov. JDBCRealm vytvára pre každý proces autentifikácie nové databázové spojenie, čo má veľký vplyv na spotrebu systémových prostriedkov. Naopak DataSourceRealm využíva JNDI dátový zdroj spravovaný takzvaným connection brokerom. Teda pre potreby autentifikácie a autorizácie sa využíva zjednodušene povedané zdieľané databázové pripojenie, čo jednoznačne šetrí prostriedky.

Čo sa týka nárokov na štruktúru databázy obsahujúcej užívateľské informácie, sú presne rovnaké ako u JDBCRealmu. Musí teda obsahovať tabuľku, v ktorej jednotlivé záznamy predstavujú jednoznačnú informáciu o užívateľoch. Konkrétne aspoň dva stĺpce, kde jeden predstavuje užívateľské meno a druhý heslo. Ďalej musí obsahovať tabuľku, kde riadky sú nositeľmi informácií o priradených roliach jednotlivým užívateľom. Rovnako musí obsahovať aspoň dva stĺpce. Jeden predstavuje užívateľské meno a druhý obsahuje žiadnu, jednu alebo viac priradených rolí oddelených čiarkou.

Podobne aj proces nastavenia tohto realmu je takmer identický. Avšak obsahuje jednu výnimku a to je vytvorenie JNDI dátového zdroja. Ako taký zdroj vytvoriť sme preberali v článku Java Servlets – JDBC, JNDI a dátové zdroje II. Pre zopakovanie však uvediem krátku ukážku editácie súboru server.xml.

<Resource name=“jdbc/myoracle“ auth=“Container“
    type=“javax.sql.DataSource“/>
 
<ResourceParams name=“jdbc/myoracle“>
 <parameter>
  <name>factory</name>
  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
 </parameter>
 <parameter>
  <name>driverClassName</name>
  <value>oracle.jdbc.driver.OracleDriver</value>
 </parameter>
 <parameter>
  <name>url</name>
  <value>jdbc:oracle:thin:myschema@127.0.0.1:1521:mysid</value>
 </parameter>
 <parameter>
  <name>username</name>
 <value>scott</value>
 </parameter>
 <parameter>
  <name>password</name>
  <value>tiger</value>
 </parameter>
</ResourceParams>

Takto vlastne vytvoríte JNDI dátový zdroj pre databázu Oracle pomenovaný jdbc/myoracle. Tento zápis treba vložiť pod úroveň elementu Engine, Host alebo Context. Záleží pre akú oblasť má daný zdroj platiť.

Tak ako pri ostatných typoch realmov aj tu treba do súboru server.xml vložiť element Realm, ktorý má nasledovné atribúty:

  • className
    – v tomto prípade vložte reťazec org.apache.catalina.realm.DataSourceRealm.
  • dataSourceName
    – JNDI (jdbc/myoracle) názov dátového zdroja.
  • userTable
    – názov autentifikačnej tabuľky obsahujúcej užívateľské mená a heslá.
  • userRoleTable
    – názov autentifikačnej tabuľky obsahujúcej užívateľské mená a k nim priradené role.
  • userNameCol
    – názov stĺpca v oboch autentifikačných tabuľkách obsahujúci užívateľské meno.
  • userCredCol
    – názov stĺpca v autentifikačnej tabuľke obsahujúci užívateľské heslá.
  • roleNameCol
    – názov stĺpca v autentifikačnej tabuľke obsahujúci názvy rolí priradených k menám.
  • debug
    – atribút nastavuje mieru detailov logovacieho súboru asociovaného s daným realmom. Čím vyššie číslo, tým viac detailov. Atribút je nepovinný, defaultná hodnota je nula.
  • digest
    – môže obsahovať názov algoritmu použitého na šifrovanie hesiel. Akceptovateľný názov je ten, ktorý vyhovuje podmienkam triedy java.security.MessageDigest, konkrétne ide o SHA, MD2, alebo MD5. Atribút je nepovinný.

Aj pri predchádzajúcich typoch sme si ukázali príklad nakonfigurovaného elementu Realm, preto tradíciu neporušíme ani teraz, rovnako ako ju neporušíme ani pri nasledujúcom a poslednom type.

<Realm
   className=“org.apache.catalina.realm.DataSourceRealm“
   dataSourceName=“java:/comp/env/jdbc/myoracle“
   debug=“99″ userCredCol=“user_pass“
   userTable=“users“ userNameCol=“user_name“
   userRoleTable=“user_roles“ roleNameCol=“role_name“/>

Princíp činnosti DataSourceRealmu

Princíp fungovania, s výnimkou využívania zdieľaného pripojenia, je úplne rovnaký ako pri JDBCRealme.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *