• No results found

Ukázka kontroly serveru p ed spušt ním aplikace v Nette

In document Liberec 2014 Jakub Jirouš (Page 28-34)

6.2 Vytvo ení p ipojení k databázovému serveru

Vstupním bodem do celé aplikace je vytvo ení p ipojení k databázovému serveru.

K tomuto ú elu slouží p ihlašovací formulá , který získává p ihlašovací údaje od uživatele. Na základ t chto údaj je vytvá eno p ipojení k databázovému serveru.

Pro p ipojení k databázovému serveru je nutné znát jeho umíst ní, v našem p ípad IP adresu ve verzi 4. Je možné uvést i íslo portu pro up esn ní, jedná se však o nepovinný údaj. Dále se získává jméno a heslo uživatele s nastaveným oprávn ním s možností p i-pojení na server. Posledním údajem je název databáze, který musí být shodný s názvem databáze na serveru.

V p ípad bezchybného zadání všech p ihlašovacích údaj dochází k p ipojení k da-tabázovému serveru. Pokud je n jaký z údaj vypln n chybn , dojde k výpisu chybové hlášky.

P i vývoji b žných webových aplikací v Nette se využívá toho, že jsou p ihlašovací údaje k MySQL databázi, se kterou po celou dobu aplikace pracuje ve výchozím stavu definované v konfigura ním souboru. V Nette se tyto údaje ukládají do konfigura ního souboru se syntaxí NEON.

Zdrojový kód 3: P ihlašovací údaje k databázi v konfigura ním souboru NEON

Tento zp sob nebylo možné p i vývoji aplikace využít, jelikož se od aplikace o e-kává, že je schopná samostatného a automatického p ipojení k r zným databázovým server m. Nebylo možné využít statickou informaci uloženou v konfigura ním souboru pro p ipojení vždy pouze k jedné databázi, proto bylo nutností navrhnout vlastní zp sob vytvá ení p ipojení.

( ! " ) * + ,$ , - - .

Vlastní zp sob p ipojení zpracovává získané údaje z p ihlašovacího formulá e a vy-tvá í z nich p ipojení k databázovému serveru.

Nette disponuje knihovnou Nette\Database\Connection reprezentující propojení mezi PHP a databázovým serverem, která obsahuje konstruktor. Za využití konstruktoru je možné vytvo it p ipojení k databázi [13].

public __construct($dsn, $user = NULL, $password = NULL, array $options = NULL)

Zdrojový kód 4: Konstruktor Nette\Database\Connection

Pomocí konstruktoru z výše uvedené knihovny a p ihlašovacích údaj , bylo možné vytvo it p ipojení k databázi bez nutnosti použití konfigura ního souboru. Navíc byla za-chována možnost p ipojení se k více r zným server m.

6.3 Session prom nné

K tomu, aby bylo možné vytvá et p ipojení k serveru opakovan , je nutné získané údaje z p ihlašovacího formulá e uchovávat. Jelikož se má aplikace p ipojovat k r zným databázovým server m, není možné tyto údaje na ítat z konfigura ního souboru.

Nejvhodn jším zp sobem je využití session prom nných, kde se každý z údaj použitých v p ihlašovacím formulá i uloží do p íslušné prom nné. P ipojení k databázo-vému serveru je následn vytvá eno z t chto uložených údaj vždy, když vznikne požadavek na provedení n jaké operace nad databází.

( /0 1 , 2

Na rozdíl od istého PHP, kde je uložišt se session prom nnými realizováno jako pole p ístupné p es globální prom nnou $_SESSION, je v Nette toto úložišt d leno do sekcí. Sekce jsou objekty Nette\Http\SessionSection. Každá ást programu m že používat svou vlastní sekci s unikátním jménem a p edcházet tím vznik m kolizí v názvech.

Správu session prom nných obstarává objekt t ídy Nette\Http\Session, který nevy-tvá í instanci p ímo, ale získává tuto instanci t ídy jako službu session ze systémového DI kontejneru [14].

Nastává obdobný problém jako s vytvá ením p ipojení k databázi. V b žné webové aplikaci je sekce session prom nné definována vždy na za átku jedné ze t íd modelové vrstvy. Pokud by se p ihlašovací údaje více uživatel ukládaly do stejné session sekce, docházelo by k p emazání aktuáln uložených údaj nov p ipojeným uživatelem, což je nežádoucí efekt.

Pokud by se název session sekce náhodn generoval, vznikl by sice vždy originální název pro session sekci, ale p i op tovném p ipojení uživatele neexistuje zp sob, jak se k tomuto vygenerovanému názvu zp tn dostat.

( ! 3- 4 56 , 7 , * ) . 4 + ,14 4 7 8

Problém spojený s vytvo ením originálního názvu pro session sekci vy ešilo jedno z dalších vlastních ešení. Jelikož se každý uživatel p ihlašuje k databázovému serveru pod vlastním uživatelským jménem, bylo práv uživatelské jméno využito p i vytvá ení názvu session sekce.

Název session sekce je vytvo en pomocí hashe z uživatelského jména konkrétního uživatele, ímž je zajišt no op tovné vytvo ení názvu session sekce i p i uživatelov op -tovném p ipojení. Uživatelské jméno je p enášeno v celé aplikaci prost ednictvím parametru v URL adrese, aby se bylo možné kdykoliv p ipojit do konkrétní session sekce a z údaj v ní uložených vytvo it p ipojení k databázovému serveru. Tento zp sob eší problém hromadného p ipojení více uživatel z jednoho webového prohlíže e najednou, protože se vždy pro každého uživatele vytvo í originální název session sekce, do které si ukládají vlastní data.

public static function calculateHash($user) { if ($user === Strings::upper($user)) { $user = Strings::lower($user);

}

$user = substr($user, 0, self::PASSWORD_MAX_LENGTH);

return sha1($user);

}

Zdrojový kód 5: Funkce pro vytvo ení hashe z uživatelského jména

public function setSectionName($user) {

$this->sectionName = $this->calculateHash($user);

$this->section = $this->session->getSection($this->sectionName);

}

Zdrojový kód 6: Nastavení názvu session sekce pomocí uživatelského jména

6.4 Výpis databází na serveru

Aplikace je nyní ve fázi, kdy se dokáže bezpe n p ipojit k libovolnému databázo-vému serveru a zvládne p ipojení více uživatel prost ednictvím jednoho webového prohlíže e.

Po p ipojení aplikace k databázovému serveru je zobrazen výpis všech dostupných databází na serveru s dopl ujícími informacemi jako je název databáze, kódování, druh porovnání, velikost databáze a po et tabulek.

Pomocí následujícího SQL dotazu [15] jsou zjišt ny všechny názvy databází vy-skytujících se na serveru.

SHOW DATABASES;

Zdrojový kód 7: Výpis názv databází obsažených na serveru

Informace o kódování a porovnaní databáze jsou získávány ze systémových pro-m nných MySQL prost ednictvípro-m následujících SQL dotaz [16].

SHOW VARIABLES LIKE 'character_set_database';

SHOW VARIABLES LIKE 'collation_database';

Zdrojový kód 8: Získání kódování a porovnání databáze

Využívá se zde informa ní databáze INFORMATION_SCHEMA, která poskytuje p ístup k metadat m databáze. Z databázových metadat je vypo ítáván údaj o velikosti databáze. V informa ní databázi je umíst na tabulka TABLES obsahující informace o ta-bulkách v databázích. Výsledkem sou tu hodnot ve sloupcích DATA_LENGTH, INDEX_LENGTH je velikost databáze v jednotkách bajt .

Hodnota výsledku v jednotkách bajt je následn p i výpisu v šablon , za pomocí nov vytvo ené funkce kibytes umíst né v knihovn s filtry Latte, p evedena na hodnotu

Pro zjišt ní po tu tabulek v databázi se op t využívá tabulka TABLES. Výpis dat je ovlivn n podmínkou. Hodnota ve sloupci TABLE_SCHEMA musí odpovídat názvu data-báze, pro kterou je zjiš ován po et tabulek. Výsledný po et tabulek odpovídá sou tu všech vypsaných ádk .

6.5 Tabulky v databázi

Obdobn jako výpis všech databází na serveru funguje i zobrazení všech tabulek v dané databázi, s tím rozdílem, že místo databází se zobrazují tabulky.

Veškeré informace o jednotlivých tabulkách jsou op t získávány z informa ní da-tabáze INFORMATION_SCHEMA z tabulky TABLES.

V následující tabulce jsou znázorn ny všechny sloupce, které byly pro výpis infor-mací o jednotlivé tabulce použity.

AUTO_INCREMENT - hodnoty auto increment TABLE_COMMENT - komentá

6.6 Struktura tabulky

Dalším bodem v procházení hierarchické struktury databáze je zobrazení struktury tabulky.

SHOW FULL COLUMNS FROM `databaze`.`tabulka`;

Zdrojový kód 9: Zobrazení struktury tabulky

Pro zobrazení struktury tabulky je použit výše uvedený SQL dotaz [17], pomocí n hož se zobrazí veškeré informace o struktu e jednotlivých sloupc v tabulce.

Výsledkem zpracovaného dotazu jsou informace o názvu sloupce, p íslušném da-tovém typu a jeho velikosti, v p ípad íselného datového typu znaménkové omezení.

U textových datových typ je uveden typ použitého porovnání. Každý sloupec uvádí, zda m že jeho hodnota obsahovat nulovou hodnotu, nebo jestli má p i azenou klí ovou hod-notu. Struktura tabulky obsahuje i informace o výchozí nastavené hodnot . Pole EXTRA obsahuje veškeré rozši ující informace, které jsou u sloupce k dispozici. Poslední dv pole obsahují informaci o p id litelném oprávn ní sloupci a komentá .

In document Liberec 2014 Jakub Jirouš (Page 28-34)