10. diel - Derby DB - Práva prístupu - Autentizácia
V minulej lekcii, Derby DB - Vytvorenie a odstránenie databázy a tabuľky , sme sa venovali vytváranie a odstraňovanie databázových tabuliek. Dnešné DerbyDB tutoriál bude o autentizáciu.
Podrobný popis nastavenie práv sa nachádza v
Security guide.pdf
(tvz. Identity v Derby). Derby má trochu
odlišný spôsob nastavovania prístupu k databázam a tabuľkám oproti
štandardným databázam typu napr. MySQL, MS-SQL, PostgreSQL, apod. Ďalej
nedisponuje žiadnym GUI nástrojom (ako napr. Workbench u MySQL) pre správu
práv a všetko sa musí riešiť cez IJ nástroj alebo programovo cez Javu, čo
osobne považujem za veľký nedostatok oproti spomínaným databázam.
Pre systém prístupu a prácu s Derby databázou nepotrebujeme mať viac užívateľov. Možno mať len jedného, ktorý má prístup ku všetkému (tzv. Správcu databázy = stvoriteľ databázy). Tento správca má následne prístup do každej tabuľky so všetkými právami (čítanie, zápis, úpravy, zmazanie, a pod.). Avšak z dôvodu bezpečnosti, správy a kontroly sa toto neodporúča. Avšak ak by ste používali embedded databázu ako súčasť desktop aplikácie pre úschovu dát, potom je systém práv v tomto prípade úplne zbytočný.
V nasledujúcich lekciách si predvedieme niečo o nastavenie práv prístupu s viacerými užívateľmi.
Pre nastavenie prístupu k databáze sa využívajú tieto činnosti:
- Autentizácia (Authentification): Dochádza k overenie predtým, než používateľ dostane prístup (napr. Pri prihlasovaní k databáze).
- Autorizácia (Authorization): Po úspešnom overení dôjde k pridelenie práv (napr. Práva prístupu, čítanie, zápis a pod ...).
Autentizácie
Derby DB podporuje 3 typy (módy) autentizácia: LDAP, NATIVE a USER-DEFINE.
- LDAP je mód, kedy sa o autentizáciu stará LDAP directory service. Ide o službu bežiaci na rovnakom alebo inom počítači. Teda je nutné vykonať nakonfigurovanie Derby Serveru pre túto službu. Toto je výhodné ak spravujete overovanie k viac prístupom a službám centrálne. Nevýhodou je nižšia bezpečnosť.
- NATIVE mód je spôsob, kedy sú heslá užívateľov uložené v samotnej databáze. Tento mód si predvedieme.
- USER-Define je mód, kedy si spravujeme logiku potrebnú pre overovanie používateľov sami.
Autorizácia
Derby Db podporuje 2 typy (módy) autorizáciou: Coarse-grained authorization, Fine-grained authorization.
- Coarse-grained authorization (tzv. Hrubozrnné oprávnenie)
je, keď vlastník databázy rozdelí užívateľa do dvoch skupín. Jedna
skupina má plnú autoritu pre čítanie a zápis, druhá skupina má právo iba
čítať (vzorový príklad s logikou vysvetlenie je priamo v
Security guide.pdf
). Hrubozrnnej delenie nie je príliš optimálne, pretože neumožňuje izolovaný prístup jednotlivých užívateľov. - Fine-grained authorization (tzv. Jemnozrnnej oprávnenia)
známe ako štandardné SQL oprávnenie. V tom vlastník databázy či
jednotliví používatelia alebo skupiny nastaví podrobnejšie SQL
GRANT
/REVOKE
príkazy (otázky). PríkazGRANT
sa používa na udelenie konkrétnych oprávnenie užívateľom alebo rolám alebo k udeleniu rolí k užívateľom alebo k rolám. PríkazREVOKE
sa používa na odobratie oprávnenia a rolí. Príkazy, ktoré sa povoľujú (GRANT
) alebo zakazujú (REVOKE
), sú:DELETE
/EXECUTE
/INSERT
/SELECT
/REFERENCES
/TRIGGER
/UPDATE
.
Príklad
Ako príklad si vykonáme nastavenie práv s autentizáciou NATIVE as autorizáciou kombinácia COARSE grained + FINE grained. Je to z toho dôvodu, že táto kombinácia je ako príklad najvhodnejší. Len pripomeniem, že stvoriteľ databázy je jej vlastník (tzv. Superpoužívateľ), má práva pre pridávanie užívateľov a nastavovanie práv prístupu, ak si ich sám v neskoršej časti neupraví. V tomto tutoriále si predvedieme nastavenie autentizácie, tzn. vytvoríme (pridáme) používateľa do DerbyDB.
Nastavenie autentizácia (Authentification) cez IJ
Najskôr si postup predvedieme cez konfiguračný príkaz IJ. Prihlásime sa a vytvoríme databázu. Ak chceme pridať nových používateľov, je nutné najskôr pridať používateľa, ktorý bol použitý pri tvorbe databázy a je jej vlastník. Po pridaní používateľov je nutné databázu vypnúť (reštartovať). Potom sa už k danej databáze prihlásime ako novo vytvorenie užívatelia.
ij version 10.13 ij>connect 'jdbc:derby:databaze10;create=true;user=uzivatel10;password=heslo10'; ij>call SYSCS_UTIL.SYSCS_CREATE_USER( 'uzivatel10', 'heslo10' ); ij>call SYSCS_UTIL.SYSCS_CREATE_USER( 'uzivatel10a', 'heslo10a' ); ij>call SYSCS_UTIL.SYSCS_CREATE_USER( 'uzivatel10b', 'heslo10b' ); ij>call SYSCS_UTIL.SYSCS_CREATE_USER( 'uzivatel10c', 'heslo10c' ); ij>connect 'jdbc:derby:databaze10;shutdown=true'; ij>disconnect; ij>exit;
výsledok:
Vytvorenie užívateľov programovo
Testovací príklad si vytvoríme ako nový Java SE projekt v našom IDE. V menu vyberieme File -> New -> Java Project. Pomenujeme projekt a nastavíme JRE Java8. Pridáme opäť externé knižnice do nášho projektu do CLASSPATH. Ide o tieto externé knižnice:
derbyclient.jar
derbytools.jar
derbyoptionaltools.jar
Čo v kóde urobíme? Vytvoríme objekt spojenie, cez objekt dotazu zavoláme
IJ a cez ten uložíme nových používateľov. A potom sa odpojíme, čím
vlastne vykonáme reštart databázy. Potom sa môžete skúsiť prihlásiť cez
IJ nástroj ako užívateľ uzivatel10c
, ako to ide vidieť zo
screenshotu.
package datab; import java.sql.*; public class VytvoreniAutentifikace { private static Connection connect = null; private static PreparedStatement statement = null; static { try { Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { System.out.println("Problem s nactenim driveru - nutne pridat do CLASSPATH"); } } private static void pripojeniDatabaze() { try { connect = DriverManager.getConnection("jdbc:derby:C:/Program Files/JavaJDK8_144/db/bin/databaze10;create=true;user=uzivatel10;password=heslo10;"); System.out.println("Podarilo se pripojit k databazi10"); } catch (Exception e) { System.err.println("Nepodarilo se pripojit k databazi10"); if (connect == null) { System.exit(1); } } } private static void pridameUzivateleNATIVE(String user, String pass) { String prikaz = "CALL SYSCS_UTIL.SYSCS_CREATE_USER(?,?)"; try { statement = connect.prepareStatement(prikaz); statement.setString(1,user); statement.setString(2,pass); statement.executeUpdate(); System.out.println("Povedlo se pridat uzivatele : "+user); } catch (SQLException e) { System.out.println("Nepovedlo se pridat uzivatele :"+user); e.printStackTrace(); } } private static void odpojimeDatabazi() { try { if (statement != null) { statement.close(); } if (connect != null) { connect.close(); } System.out.println("Podarilo se odpojit od databaze"); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Start Programu"); pripojeniDatabaze(); pridameUzivateleNATIVE("uzivatel10","heslo10"); pridameUzivateleNATIVE("uzivatel10a","heslo10a"); pridameUzivateleNATIVE("uzivatel10b","heslo10b"); pridameUzivateleNATIVE("uzivatel10c","heslo10c"); odpojimeDatabazi(); System.out.println("Konec Programu"); } }
Prečo PreparedStatement
a nie Statement
? Je to preto, že objekt dotazu Statement
spôsobí pád programu,
má problém so String
ya volanie "CALL" nie je podporované.
DerbyDB s ním jednoducho padá (viď. ReferenceDB.pdf
).
Teraz hlavne nezabudnite reštartovať Derby Server (tvz. Vypnúť a zapnúť). Nabudúce, v lekcii Derby DB - Práva prístupu - authorizáciu , si predvedieme nastavení autorizácie.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 5x (5.27 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java