• No results found

SQL TESTER

N/A
N/A
Protected

Academic year: 2022

Share "SQL TESTER"

Copied!
59
0
0

Loading.... (view fulltext now)

Full text

(1)

SQL TESTER

Bakalářská práce

Studijní program: B2646 – Informační technologie Studijní obor: 1802R007 – Informační technologie Autor práce: Jakub Venglář

Vedoucí práce: Ing. Jana Vitvarová, Ph.D.

(2)

SQL TESTER

Bachelor thesis

Study programme: B2646 – Information Technology Study branch: 1802R007 – Information Technology

Author: Jakub Venglář

Supervisor: Ing. Jana Vitvarová, Ph.D.

(3)
(4)
(5)
(6)

Abstrakt

Prvn´ı ˇc´ast pr´ace popisuje kompletn´ı funkcionalitu aplikace SQL Tester a tak´e n´avrh da- tov´eho modelu. SQL Tester je aplikace pro podporu pˇredmˇetu Datab´azov´e syt´emy na Technick´e univerzitˇe v Liberci. Automatizuje kotrolu SQL dotaz˚u a t´ım ˇsetˇr´ı uˇcitel˚um ˇcas a student˚um nab´ız´ı moˇznost testovat sv´e znalosti. Druh´a f´aze zab´yvaj´ıc´ı se implementac´ı kombinuje popis technologi´ı s jejich konkr´etn´ım vyuˇzit´ım v aplikaci. Vzhledem k tomu, ˇze je aplikace postavena nad Oracle datab´az´ı a Java EE frameworky, jsou zde uvedeny napˇr´ıklad technologie Spring, Java Persistence API, JavaServer Faces, PrimeFaces a mnoho dalˇs´ıch.

Rovnˇeˇz je zde popis zvolen´e architektury a zabezpeˇcen´ı aplikace. V posledn´ı tˇret´ı f´azi pr´ace seznamuje s testov´an´ım aplikace v re´aln´em provozu a s funkˇcn´ımi testy.

Kl´ıˇ cov´ a slova

webov´a aplikace, SQL, JPA, Spring, PrimeFaces

Abstract

The first part of the work introduces the complete functionality of the SQL Tester ap- plication and its data model. SQL Tester supports the Database Systems course at the Technical University of Liberec. It automatically checks SQL queries. The second imple- mentation part combines the general descriptions of chosen technologies with the expla- nation of their particular use in the SQL Tester application. As the application is built on Oracle database and Java EE frameworks we discuss here, among other, technologies such as Spring, Java Persistence API, JavaServer Faces, PrimeFaces as well as the overall architecture and security issues. The functional testing and real traffic tests are described in the last third section.

Keywords

web application, SQL, JPA, Spring, PrimeFaces

(7)

OBSAH

Obsah

1 Uvod´ 12

1.1 C´ıle pr´ace . . . 12

2 N´avrh aplikace 13 2.1 Jak´y probl´em aplikace ˇreˇs´ı? . . . 13

2.2 Z´akladn´ı poˇzadavky zadavatele . . . 13

2.3 UseCase diagram a relaˇcn´ı datov´y model . . . 13

2.4 Z´akladn´ı funkce aplikace . . . 13

2.4.1 Role student . . . 14

2.4.2 Role administr´ator . . . 14

2.4.3 Role uˇcitel . . . 14

2.5 N´avrhov´y vzor MVC a architektura aplikace . . . 15

3 Pˇr´ıprava pˇred v´yvojem 17 3.1 Webov´y server Apache Tomcat 8 . . . 17

3.2 Datab´azov´y server Oracle XE 11g . . . 17

3.3 V´yvojov´e prostˇred´ı NetBeans IDE 8 . . . 17

3.4 Vytvoˇren´ı Maven projektu . . . 18

3.5 Verze knihoven . . . 18

3.6 Syst´em bal´ıˇck˚u . . . 19

4 Model 20 4.1 Domain . . . 20

4.1.1 ORM . . . 20

4.2 Repository . . . 21

4.2.1 Hibernate . . . 21

4.2.2 JPA . . . 23

4.2.3 Spring Data JPA . . . 24

4.3 Service . . . 25

4.3.1 Spring . . . 25

4.3.2 Validace a Verifikace SQL dotazu . . . 26

5 Controller 28

(8)

OBSAH

6 View 29

6.1 JSF . . . 29

6.2 PrimeFaces . . . 30

6.3 PrettyFaces . . . 31

6.4 ˇSablona . . . 31

6.5 Chybov´e str´anky . . . 32

6.6 Resources . . . 32

6.7 Lokalizace . . . 33

7 Zabezpeˇcen´ı 35 7.1 HTTPS . . . 35

7.1.1 Certifik´at . . . 35

7.2 Spring security . . . 36

7.3 Autentizace uˇzivatel˚u . . . 37

7.4 Shibboleth . . . 38

7.5 Spring SAML . . . 39

7.6 Ochrana proti 10 nejˇcastˇejˇs´ım rizik˚um podle OWASP . . . 39

7.6.1 SQL Injection . . . 39

7.6.2 Odcizen´ı hesel a spr´ava sessions . . . 40

7.6.3 XSS . . . 40

7.6.4 Nezabezpeˇcen´e pˇr´ım´e odkazy na objekty . . . 41

7.6.5 Nebezpeˇcn´a konfigurace . . . 41

7.6.6 Zveˇrejnˇen´ı citliv´ych dat . . . 41

7.6.7 Chyby v ˇr´ızen´ı ´urovn´ı pˇr´ıstup˚u . . . 42

7.6.8 CSRF . . . 42

7.6.9 Pouˇzit´ı zn´am´ych zraniteln´ych komponent . . . 42

7.6.10 Neoˇsetˇren´e pˇresmˇerov´an´ı a pˇred´av´an´ı . . . 42

7.6.11 Clickjacking . . . 42

7.7 Validace vstup˚u . . . 43

7.8 Logov´an´ı . . . 43

8 Testov´an´ı 44

(9)

OBSAH

9 Z´avˇer 45

9.1 Splnˇen´ı c´ıl˚u . . . 45

Pouˇzit´a literatura 46

Pˇr´ılohy 49

A Obsah CD 49

B Use Case diagram 50

C Relaˇcn´ı datov´y model 51

D Procedura v PL/SQL vracej´ıc´ı XML 52

E Administrace uˇzivatel˚u 53

F Reˇˇ sen´ı ´uloh 54

G Dialog editace krouˇzku 55

H Spr´ava krouˇzk˚u 56

I Spouˇstˇen´ı SQL dotaz˚u 57

J Chybov´a str´anka 58

(10)

SEZNAM OBR ´AZK˚U

Seznam obr´ azk˚ u

1 Architektura aplikace SQL Tester . . . 15

2 Syst´em bal´ıˇck˚u . . . 19

3 ORM sch´ema . . . 20

4 Datab´azov´e sch´ema pro ORM . . . 21

5 Sch´ema JPA . . . 24

6 Tabulka uˇzivatel˚u v PrimeFaces . . . 30

7 Z´ahlav´ı str´anky s logem a menu . . . 32

8 Z´apat´ı str´anky s vlajeˇckami . . . 33

(11)

SEZNAM OBR ´AZK˚U

Seznam zkratek

AJAX

Asynchronous JavaScript and XML AOP

Aspect Oriented Programming API

Application Programming Interface CESNET

Czech Education and Scientific NETwork CRUD

Create Read Update Delete CSRF

Cross-Site Request Forgery CSS

Cascading Style Sheets CSV

Comma Separated Values DAO

Data Access Object EJB

Enterprise Java Beans EL

Expression Language GUI

Graphical User Interface HTML

HyperText Markup Language HTTP

Hypertext Transfer Protocol HTTPS

Hypertext Transfer Protocol Secure

IDE

Integrated Development Environment IdP

Identity Provider IoC

Inversion of Control Java EE

Java Enterprise Edition JDBC

Java Database Connectivity JKS

Java KeyStore JNDI

Java Naming and Directory Interface JPA

Java Persistence API JPQL

Java Persistence Query Language JSF

JavaServer Faces JSP

JavaServer Pages JTA

Java Transaction API LDAP

Lightweight Directory Access Protocol MVC

Model View Controller ORM

Objektovˇe-relaˇcn´ı mapov´an´ı

(12)

SEZNAM OBR ´AZK˚U

OWASP

Open Web Application Security Project PDF

Portable Document Format PEM

Privacy Enhanced Mail PHP

Hypertext Preprocessor PKCS

Public Key Cryptographic Standards PL/SQL

Procedural Language/Structured Query Language

SAML

Security Assertion Markup Language SEO

Search Engine Optimization SLF4J

Simple Logging Facade for Java SP

Service Provider SQL

Structured Query Language SSO

Single Sign-On

STAG

Studijn´ı agenda TLS

Transport Layer Security TUL

Technick´a univerzita v Liberci URI

Uniform Resource Identifier URL

Uniform Resource Locator UTF-8

Universal Character Set Transformation Format

XE

Express Edition XHTML

Extensible Hypertext Markup Language XML

Extensible Markup Language XSLT

Extensible Stylesheet Language Transfor- mations

XSS

Cross-site scripting

(13)

1 UVOD´

1 Uvod ´

Svou bakal´aˇrskou prac´ı navazuji na roˇcn´ıkov´y projekt, ve kter´em jsem se sezn´amil s da- tab´az´ı Oracle a z´akladn´ımi prvky jazyka Java EE, jako jsou Java Servlets a JSP (JavaServer Pages), za ´uˇcelem vytvoˇren´ı aplikace SQL Tester. Tak´e jsem se zab´yval moˇznostmi validace a verifikace SQL dotazu. Technologie Java Servlets a JSP se ovˇsem v praxi uˇz jistou dobu nevyuˇz´ıvaj´ı. Bˇehem posledn´ıch let vzniklo nad tˇemito technologiemi nˇekolik framework˚u, bez nichˇz se dnes t´emˇeˇr neprogramuje. Proto jsem se ve sv´e bakal´aˇrsk´e pr´aci zamˇeˇril zejm´ena na nˇe. Nicm´enˇe si mysl´ım, ˇze je dobr´e zn´at i technologie pod tˇemito frameworky.

Vyuˇzil jsem tedy tuto pr´aci, abych obohatil sv´e znalosti o modern´ı technologie, kter´e se v praxi vyuˇz´ıvaj´ı a v budoucnu bych se jimi r´ad zab´yval. Druh´a motivace je vytvoˇren´ı uˇziteˇcn´e aplikace, kter´a pom˚uˇze student˚um a usnadn´ı pr´aci uˇcitel˚um. Podobnou aplikaci lze nal´ezt na str´ank´ach [9], ovˇsem je integrov´ana v port´ale s online vzdˇel´avac´ımi kurzy.

Pˇri v´yvoji aplikace jsem vyuˇzil inkrement´aln´ıho pˇr´ıstupu metodiky v´yvoje softwaru.

Tento zp˚usob v´yvoje spoˇc´ıv´a v definov´an´ı poˇzadavk˚u, n´avrhu struktury a v´yvoji samo- statn´ych funkˇcn´ıch ˇc´ast´ı aplikace. Po vytvoˇren´ı kaˇzd´e ˇc´asti jsem danou funkcionalitu kon- zultoval s vedouc´ı pr´ace. V´yhodou tohoto pˇr´ıstupu je jednoduˇsˇs´ı reakce na pˇr´ıpadn´e zmˇeny.

Pr´aci jsem rozdˇelil do tˇr´ı ˇc´ast´ı. Do prvn´ı ˇc´asti jsem zaˇradil n´avrh aplikace a zvolenou ar- chitekturu. V druh´e ˇc´asti se zab´yv´am implementac´ı aplikace. Zde kaˇzdou kapitolu zaˇc´ın´am popisem technologi´ı a konˇc´ım jejich konkr´etn´ım vyuˇzit´ım v aplikaci. Ve tˇret´ı ˇc´asti pak popi- suji zp˚usob testov´an´ı funkˇcnosti aplikace. U z´avˇereˇcn´ych prac´ı, kter´e se t´ykaj´ı informaˇcn´ıch technologi´ı a zejm´ena v´yvoje softwaru, je bˇeˇzn´e ps´at pr´aci kombinovanˇe. Takto strukturo- van´a pr´ace se i l´epe ˇcte, protoˇze po sezn´amen´ı s technologi´ı n´asleduje jej´ı konkr´etn´ı vyuˇzit´ı.

K tomuto zp˚usobu ˇclenˇen´ı pr´ace jsem dospˇel po konzultaci s vedouc´ı pr´ace.

1.1 C´ıle pr´ ace

• Sezn´amit se s frameworky pro v´yvoj webov´ych aplikac´ı v Java EE.

• Vytvoˇrit aplikaci pro testov´an´ı SQL dotaz˚u.

• Zabezpeˇcit aplikaci.

• Zvolit vhodn´y zp˚usob autentizace a autorizace uˇzivatel˚u.

• Otestovat funkˇcnost aplikace.

(14)

2 N ´AVRH APLIKACE

2 N´ avrh aplikace

2.1 Jak´ y probl´ em aplikace ˇ reˇ s´ı?

Uˇcitel´e ˇcasto na cviˇcen´ıch a u zkouˇsek v r´amci pˇredmˇetu Datab´azov´e syst´emy vyˇzaduj´ı po studentech psan´ı SQL dotaz˚u. SQL je jazyk pro komunikaci s relaˇcn´ımi datab´azemi.

Ve chv´ıli, kdy jsou dotazy sloˇzitˇejˇs´ı a student˚u je hodnˇe, je pro uˇcitele manu´aln´ı kontrola spr´avnosti dotazu pomˇernˇe ˇcasovˇe n´aroˇcn´a. Souˇcasn´y stav dokonce vypad´a tak, ˇze uˇcitel´e nˇekter´e dotazy ruˇcnˇe pˇrepisuj´ı a spouˇstˇej´ı na vlastn´ı datab´azi. Aplikace tedy tuto kontrolu automatizuje a usnadn´ı uˇcitel˚um pr´aci. Z mal´e reˇserˇse vyplynulo, ˇze kaˇzd´y semestr uˇsetˇr´ı uˇcitel˚um pˇres 20 hodin. Nav´ıc umoˇzn´ı procviˇcovat SQL dotazy se studenty ˇcastˇeji.

2.2 Z´ akladn´ı poˇ zadavky zadavatele

Zadavatel m´a na aplikaci nˇekolik z´akladn´ıch poˇzadavk˚u. Aplikace m´a umoˇznit uˇcitel˚um vytv´aˇret v datab´az´ıch tabulky a plnit je daty. Nad tˇemito datab´azemi mohou uˇcitel´e vytv´aˇret testovac´ı ot´azky. Studenti mohou tyto ot´azky ˇreˇsit a uˇcitel´e uvid´ı jejich ´uspˇeˇsnost.

S kompletn´ı funkcionalitou n´as sezn´am´ı kapitola 2.4.

2.3 UseCase diagram a relaˇ cn´ı datov´ y model

Jelikoˇz jsem se n´avrhem aplikace zab´yval jiˇz v roˇcn´ıkov´em projektu, zm´ın´ım pouze Use- Case diagram (zvan´y i diagram pˇr´ıpad˚u uˇzit´ı) a relaˇcn´ı datov´y model v pˇr´ıloze B a C.

V roˇcn´ıkov´em projektu jsem specifikoval z´akladn´ı poˇzadavky, vytvoˇril jsem UseCase dia- gram, sekvenˇcn´ı diagramy, logick´y a relaˇcn´ı datov´y model. Protoˇze se mˇenily poˇzadavky na aplikaci, bylo nutn´e prov´est zmˇeny i v modelu. UseCase diagram je kv˚uli pˇrehlednosti zjednoduˇsen´y. Jednotliv´e pˇr´ıpady uˇzit´ı by bylo jeˇstˇe moˇzn´e rozdˇelit a v´ıce konkretizovat.

V t´eto pr´aci bych se r´ad v´ıce zab´yval architekturou a implementac´ı aplikace.

2.4 Z´ akladn´ı funkce aplikace

Aplikace obsahuje 3 uˇzivatelsk´e role. Konkr´etnˇe se jedn´a o administr´atora, uˇcitele a stu- denta.

(15)

2 N ´AVRH APLIKACE

2.4.1 Role student

• M˚uˇze ˇreˇsit ´ulohy. ´Uloha obsahuje sadu testovac´ıch ot´azek. ´Ulohy se dˇel´ı do kategori´ı voln´e ´ulohy, zkouˇskov´e ´ulohy a dom´ac´ı ´ukoly. Liˇs´ı se v poˇctu pokus˚u, kter´e m´a student k dispozici pro ˇreˇsen´ı kaˇzd´e ot´azky.

• M˚uˇze sledovat statistiky sv´e ´uspˇeˇsnosti.

2.4.2 Role administr´ator

• Spravuje sekci ˇcasto kladen´ych ot´azek.

• Spravuje uˇzivatele a pˇridˇeluje uˇzivatelsk´e role. Administr´ator z informaˇcn´ıho syst´emu STAG z´ısk´a seznam student˚u a uˇcitel˚u v souboru aplikace Excel. Tento soubor pˇred´a aplikaci a ta vytvoˇr´ı vlastn´ı datab´azi uˇzivatel˚u, kter´ym pˇridˇel´ı roli studenta. P˚uvodnˇe jsem chtˇel vyuˇz´ıt ˇskoln´ı datab´aze, ale bohuˇzel webov´e sluˇzby syst´emu STAG zat´ım nemaj´ı vhodn´e a volnˇe dostupn´e rozhran´ı. Nicm´enˇe i mnou zvolen´e ˇreˇsen´ı je velice jednoduch´e a uˇzivatelsky nen´aroˇcn´e.

2.4.3 Role uˇcitel

• Spravuje testovac´ı datab´aze. Kaˇzd´a datab´aze obsahuje specifikaci, seznam tabulek a obr´azky sch´emat. Pro tvorbu specifikace a relac´ı je k dispozici HTML editor.

• Spravuje testovac´ı ot´azky. Kaˇzd´a ot´azka obsahuje zad´an´ı a spr´avn´e ˇreˇsen´ı. K tomu se nav´ıc ot´azky ˇrad´ı do 3 skupin podle obt´ıˇznosti. Tyto skupiny jsou pak barevnˇe odliˇseny.

• Spravuje ´ulohy. Ke kaˇzd´e ´uloze lze pˇriˇradit libovoln´y poˇcet ot´azek z jedn´e datab´aze.

Ulohy je pak moˇ´ zn´e ˇreˇsit v nastaven´em ˇcase.

• Sleduje ´uspˇeˇsnost student˚u pomoc´ı statistik. Tabulky lze vyexportovat do form´atu PDF, XML, XLS a CSV. Grafy lze vyexportovat jako obr´azek.

• Spravuje krouˇzky. Uˇcitel´e si tˇr´ıd´ı studenty do krouˇzk˚u. Krouˇzek m˚uˇze pˇredstavovat cviˇcen´ı nebo zkouˇsku.

• Vyuˇz´ıv´a n´astroj pro spouˇstˇen´ı SQL dotaz˚u. Umoˇzˇnuje mu spouˇstˇet v testovac´ıch datab´az´ıch SQL dotazy a sledovat v´ystup z datab´aze.

(16)

2 N ´AVRH APLIKACE

2.5 N´ avrhov´ y vzor MVC a architektura aplikace

N´avrhov´y vzor MVC (Model View Controller) je velmi rozˇs´ıˇren´y a velice dobˇre se uplatˇnuje ve webov´ych aplikac´ıch. Jeho hlavn´ı myˇslenkou je oddˇelit logickou ˇc´ast aplikace od jej´ıho grafick´eho v´ystupu. Aplikaci rozdˇel´ıme na 3 komponenty:

• Model - Obsahuje logiku pro pr´aci s daty.

• View - Vykresluje data z modelu.

• Controller - Sb´ır´a poˇzadavky od uˇzivatele a zprostˇredkov´av´a komunikaci mezi Mo- delem a View.

Ovˇsem jak se MVC konkr´etnˇe implementuje, z´aleˇz´ı na pouˇzit´e technologii. Napˇr´ıklad im- plementace v jazyce PHP je odliˇsn´a od implementace v jazyce Java. ˇCasto se tak´e pouˇz´ıv´a v kombinaci s jin´ymi n´avrhov´ymi vzory, pˇr´ıpadnˇe existuj´ı jeho r˚uzn´e modifikace.

Obr´azek 1: Architektura aplikace SQL Tester

Nyn´ı se pod´ıv´ame na architekturu aplikace SQL Tester. Drˇzel jsem se pouˇz´ıvan´eho n´avrhu pro zvolen´e technologie. Z´akladn´ı sch´ema a princip komunikace mezi jednotliv´ymi komponentami jsem zachytil na obr´azku 1. Nˇekter´e odborn´e term´ıny jsem ponechal v

(17)

2 N ´AVRH APLIKACE

anglick´em jazyce, tak jak se bˇeˇznˇe pouˇz´ıvaj´ı, protoˇze jejich vynucen´y pˇreklad by mohl b´yt matouc´ı.

Vid´ıme zde webov´y server, na kter´em je um´ıstˇena aplikace. Aplikaci podle n´avrhov´eho vzoru MVC tvoˇr´ı 3 z´akladn´ı komponenty. Model je d´ale ˇclenˇen na dalˇs´ı 3 vrstvy. Poˇzadavky uˇzivatele, kter´e uˇzivatel zaˇsle prostˇrednictv´ım webov´eho prohl´ıˇzeˇce, zpracov´av´a Controller a na jejich z´akladˇe poˇz´ad´a Model o potˇrebn´a data. Konkr´etnˇe komunikuje s vrstvou zva- nou Service. Ta obsahuje veˇskerou logiku aplikace. Pokud je moˇzn´e vyˇr´ıdit poˇzadavek bez pˇr´ıstupu k datab´azi, pak jej Service zpracuje sama a vr´at´ı Controlleru odpovˇed’. V opaˇcn´em pˇr´ıpadˇe je potˇreba vyuˇz´ıt vrstvy Repository, kter´a m´a na starost pr´avˇe komunikaci s da- tab´az´ı. Nˇekdy se tak´e Repository oznaˇcuje jako DAO (Data Access Object) vrstva. Zde se tak´e potk´ame se tˇret´ı vrstvou Modelu, kter´e se ˇr´ık´a Domain. Jedn´a se o entitn´ı tˇr´ıdy, kter´e odr´aˇzej´ı sch´ema datab´aze. Pomoc´ı tˇechto tˇr´ıd pr´avˇe komunikuj´ı vrstvy Service a Reposi- tory. Jak komunikace pˇresnˇe prob´ıh´a, uvid´ıme v kapitole 4. Ve chv´ıli kdy m´a Controller od Service potˇrebn´a data, tak je pˇred´a View, kter´e je zobraz´ı uˇzivateli v prohl´ıˇzeˇci.

(18)

3 P ˇR´IPRAVA P ˇRED V ´YVOJEM

3 Pˇ r´ıprava pˇ red v´ yvojem

K v´yvoji webov´e aplikace v jazyce Java je tˇreba nejprve zajistit server a vhodn´e v´yvojov´e prostˇred´ı. Od ˇskoly jsem dostal k dispozici pˇr´ıstup na virtu´aln´ı server rysy.mti.tul.cz s operaˇcn´ım syst´emem Oracle Linux, kde jsem vˇse potˇrebn´e nainstaloval a zprovoznil. Na- instaloval jsem Javu 8 (Java Runtime Environment 8) a webov´y server, kter´y jsem nakon- figuroval. D´ale jsem na serveru nakonfiguroval firewall kv˚uli zpˇr´ıstupnˇen´ı a pˇresmˇerov´an´ı potˇrebn´ych port˚u. Datab´azov´y server jsem mˇel sice k dispozici jiˇz nainstalovan´y, ale rovnˇeˇz jsem provedl nˇekter´e konfigurace jako pˇridˇelov´an´ı pr´av nebo zaloˇzen´ı nov´ych ´uˇct˚u pro tes- tovac´ı datab´aze.

3.1 Webov´ y server Apache Tomcat 8

Jako webov´y server jsem zvolil Apache Tomcat 8. Jedn´a se o open-source implementaci technologi´ı Java Servlets a Java Server Pages, kter´e spadaj´ı do rozhran´ı Java EE. Hlavn´ım

´

ukolem webov´eho serveru je zpracov´avat HTTP poˇzadavky od klienta. Z´asadn´ım konfi- guraˇcn´ım souborem pro Apache Tomcat je soubor server.xml, kter´y se nach´az´ı ve sloˇzce conf. Vˇsechny potˇrebn´e informace o konfiguraci nalezneme v dokumentaci [4]. Alternativou mohou b´yt aplikaˇcn´ı servery JBoss Application Server, GlassFish nebo WebLogic.

3.2 Datab´ azov´ y server Oracle XE 11g

Datab´azov´y server se skl´ad´a z datab´aze a datab´azov´eho ˇr´ıd´ıc´ıho syst´emu. Pod pojmem datab´aze si lze pˇredstavit konkr´etn´ı data uloˇzen´a specifick´ym zp˚usobem na datab´azov´em serveru a datab´azov´y ˇr´ıd´ıc´ı syst´em je aplikace, kter´a umoˇzˇnuje s tˇemito daty nakl´adat.

Nˇekdy se lze setkat s term´ınem syst´em ˇr´ızen´ı b´aze dat. Pro svou pr´aci jsem vyuˇzil da- tab´azov´y server Oracle XE 11g, coˇz je bezplatn´a alternativa verze pro komerˇcn´ı uˇzit´ı. Jin´e datab´azov´e servery jsou napˇr´ıklad MySQL, Microsoft SQL Server nebo PostgreSQL.

3.3 V´ yvojov´ e prostˇ red´ı NetBeans IDE 8

IDE (Integrated Development Environment) je software, kter´y umoˇzˇnuje program´ator˚um jednoduˇse ps´at a ladit aplikace. ˇCesky jej lze oznaˇcit jako v´yvojov´e prostˇred´ı. Pro svou pr´aci jsem si vybral v´yvojov´e prostˇred´ı NetBeans IDE 8, na kter´e jsem zvykl´y ze ˇskoln´ı v´yuky a programuje se mi v nˇem nejl´epe. Jako open-source projekt je zcela zdarma a nav´ıc

(19)

3 P ˇR´IPRAVA P ˇRED V ´YVOJEM

je multiplatformn´ı. Lze jej tedy nainstalovat na operaˇcn´ı syst´emy Windows, Linux nebo Mac OS X. Sice se jedn´a o prostˇred´ı prim´arnˇe urˇcen´e pro v´yvoj Java aplikac´ı, ale s nˇekolika rozˇs´ıˇren´ımi jej lze vyuˇz´ıt i pro jin´e programovac´ı jazyky. Alternativou mohou b´yt napˇr´ıklad prostˇred´ı Eclipse nebo IntelliJ.

3.4 Vytvoˇ ren´ı Maven projektu

Pro zaˇc´ateˇcn´ıky je bˇeˇzn´e vytv´aˇret ve v´yvojov´em prostˇred´ı z´akladn´ı Java projekty. Takov´e projekty jsou ˇcasto na dan´em prostˇred´ı z´avisl´e a obsahuj´ı pˇrebyteˇcn´e soubory. Nav´ıc je nepohodln´e do nich pˇrid´avat nov´e knihovny. Proto se v praxi vyuˇz´ıvaj´ı n´astroje, kter´e tyto probl´emy ˇreˇs´ı. Pro sv˚uj projekt jsem se rozhodl vyuˇz´ıt velice obl´ıben´y Maven, kter´y kromˇe nez´avislosti na v´yvojov´em prostˇred´ı nab´ız´ı spoustu dalˇs´ıch uˇziteˇcn´ych n´astroj˚u.

Apache Maven je software pro spr´avu projekt˚u a v´ysledn´e sestavov´an´ı aplikac´ı. Za jeho nejvˇetˇs´ı pˇrednost se povaˇzuje spr´ava z´avislost´ı. V re´aln´ych aplikac´ıch je ˇcasto potˇreba vyuˇz´ıt nˇekolik des´ıtek extern´ıch knihoven. Aplikace SQL Tester napˇr´ıklad obsahuje kolem 100 extern´ıch knihoven. Tyto knihovny se nach´az´ı v extern´ıch nebo lok´aln´ıch repozit´aˇr´ıch.

Pˇri vyuˇzit´ı n´astroje Maven pak staˇc´ı v konfiguraˇcn´ım souboru pom.xml zadat n´azev a verzi knihovny, kterou chceme do projektu a v´ysledn´e aplikace pˇridat a nemus´ıme ji stahovat manu´alnˇe. Ale Maven toho um´ı mnohem v´ıce. Proces sestavov´an´ı aplikace m˚uˇze zahr- novat r˚uzn´e f´aze. Napˇr´ıklad je moˇzn´e vytvoˇrit dokumentaci, spustit testy nebo nahr´at aplikaci na server. Pro spuˇstˇen´ı tˇechto ˇcinnost´ı slouˇz´ı tzv. pluginy. Jeden z plugin˚u m˚uˇze napˇr´ıklad zajistit kompilaci aplikace, jin´y zase spuˇstˇen´ı test˚u. Seznam hlavn´ıch funkciona- lit m˚uˇzeme nal´ezt na ofici´aln´ıch str´ank´ach [13]. Jednoduch´e ovl´ad´an´ı zajiˇst’uje integrace Mavenu v bˇeˇzn´ych v´yvojov´ych prostˇred´ıch. Alternativn´ımi n´astroji mohou b´yt napˇr´ıklad Ant nebo Gradle.

3.5 Verze knihoven

Mezi nejd˚uleˇzitˇejˇs´ı knihovny, kter´e jsem v pr´aci pouˇzil patˇr´ı:

• JSF - 2.2.7

• Spring - 4.1.0

• JPA - 2.1

(20)

3 P ˇR´IPRAVA P ˇRED V ´YVOJEM

• Hibernate - 4.3.6

• Spring Data JPA - 1.7.0

• SLF4J - 1.7.7

• Spring Security 3.2.5

• PrimeFaces - 5.0

3.6 Syst´ em bal´ıˇ ck˚ u

Obr´azek 2: Syst´em bal´ıˇck˚u

V Javˇe se aplikace strukturuje pomoc´ı takzvan´ych bal´ıˇck˚u. Bal´ıˇcek je v podstatˇe sloˇzka na disku. Na obr´azku 2 je syst´em bal´ıˇck˚u aplikace SQL Tester. Z´akladn´ı n´azev bal´ıˇck˚u je cz.tul.fm.sqltester a pot´e n´asleduje ˇclenˇen´ı. Bal´ıˇcek component obsahuje Controllery, do- main obsahuje entitn´ı tˇr´ıdy, exception obsahuje vlastn´ı vyj´ımky, repository obsahuje tˇr´ıdy pro pr´aci s datab´az´ı, security obsahuje bezpeˇcnost, service obsahuje logiku, sqltool obsa- huje zpracov´an´ı SQL dotaz˚u od uˇzivatel˚u, util obsahuje pomocn´e n´astroje a web obsahuje vˇse co se t´yk´a webu. Bal´ıˇcek support obsahuje podp˚urn´e tˇr´ıdy, napˇr´ıklad implementace rozhran´ı.

(21)

4 MODEL

4 Model

4.1 Domain

Vrstva Modelu Domain obsahuje entitn´ı tˇr´ıdy. Jedn´a se o tˇr´ıdy, kter´e odr´aˇz´ı sch´ema da- tab´aze. Tyto tˇr´ıdy se vyuˇz´ıvaj´ı napˇr´ıˇc celou aplikac´ı. Nejz´asadnˇejˇs´ı jsou ovˇsem pro pr´aci s datab´az´ı. Objekty entitn´ıch tˇr´ıd lze ukl´adat a naˇc´ıtat z datab´aze pomoc´ı objektovˇe- relaˇcn´ıho mapov´an´ı ORM (Object Relational Mapping).

4.1.1 ORM

Pro pr´aci s datab´az´ı v Javˇe slouˇz´ı rozhran´ı JDBC (Java Database Connectivity). Umoˇzˇnuje z aplikace spouˇstˇet SQL dotazy v relaˇcn´ıch datab´az´ıch. Proˇc tedy pouˇz´ıvat objektovˇe- relaˇcn´ı mapov´an´ı? Programovac´ı jazyk Java je objektov´y, kdeˇzto relaˇcn´ı datab´aze s objekty nepracuje. Jin´ymi slovy Java ukl´ad´a data v objektech, ale relaˇcn´ı datab´aze v tabulk´ach.

S t´ımto probl´emem n´am pom´ah´a ORM. Jedn´a se o zp˚usob pˇrevodu dat mezi relaˇcn´ı da- tab´az´ı a objektovˇe orientovan´ym programovac´ım jazykem. V programu pot´e m´ısto s da- tab´azov´ymi tabulkami pracujeme s objekty. V podstatˇe se jedn´a o abstrakci nad JDBC, kdy nemus´ıme ps´at pˇr´ımo SQL dotazy a m˚uˇzeme m´ıt k´od nez´avisl´y na datab´azi. Dalˇs´ı v´yhodou je mnohem kratˇs´ı k´od neˇz pˇri pouˇzit´ı klasick´eho JDBC. To umoˇzˇnuje mnohem rychlejˇs´ı v´yvoj a pˇrehlednˇejˇs´ı k´od. Na obr´azku 3 vid´ıme zn´azornˇen´e grafick´e sch´ema pro- cesu, kde ORM vrstva zajiˇst’uje pˇrevod mezi objekty v aplikaci a tabulkami v datab´azi.

Popis ORM m˚uˇzeme nal´ezt na str´ank´ach jednoho z ORM n´astroj˚u pro Javu Hibernate [27].

Obr´azek 3: ORM sch´ema

(22)

4 MODEL

4.2 Repository

Vrstva Modelu Repository m´a za ´ukol pracovat s datab´az´ı. Je tedy tˇreba vyuˇz´ıt ORM ˇreˇsen´ı, kter´e za n´as bude mapovat entitn´ı tˇr´ıdy na tabulky a naopak. Jednou z moˇznost´ı je Hibernate.

4.2.1 Hibernate

Hibernate je asi nejzn´amˇejˇs´ı ORM ˇreˇsen´ı pro Javu. V podstatˇe nab´ız´ı vˇse, co od ORM ˇreˇsen´ı oˇcek´av´ame, napˇr´ıklad CRUD operace (vytvoˇren´ı, pˇreˇcten´ı, aktualizace a smaz´an´ı z´aznamu v datab´azi) nebo transakˇcn´ı zpracov´an´ı. Vˇse potˇrebn´e nalezneme v dokumentaci [8]. Pro lepˇs´ı pochopen´ı jak mapov´an´ı na objekty funguje, jsem vytvoˇril jednoduch´y uk´azkov´y pˇr´ıklad se vˇsemi druhy kardinalit relac´ı. Kardinalita je ˇcetnost vztahu tedy 1:1, 1:N a M:N.

Na obr´azku 4 vid´ıme, ˇze student vlastn´ı pr´avˇe jednu kartu a karta je vlastnˇena pr´avˇe jedn´ım studentem. Student m˚uˇze studovat na v´ıce fakult´ach a na fakultˇe m˚uˇze studovat v´ıce student˚u. Fakulta pak spad´a pod jednu univerzitu, ale univerzita m˚uˇze m´ıt fakult v´ıce.

N´ıˇze vid´ıme namapovan´e tˇr´ıdy.

Obr´azek 4: Datab´azov´e sch´ema pro ORM

(23)

4 MODEL

public class Student { Integer id;

String name;

String surname;

Card card;

List<Faculty> facultyList;

}

Tˇr´ıda Student obsahuje atributy tabulky Student a z´aroveˇn referenci na objekt Card a ko- lekci objekt˚u Faculty.

public class Card { Integer id;

String chip;

Student student;

}

Tˇr´ıda Card obsahuje atributy tabulky Card a referenci na objekt Student.

public class Faculty { Integer id;

String name;

List<Student> studentList;

University university;

}

Tˇrda Faculty obsahuje atributy tabulky Faculty, referenci na objekt University a kolekci objekt˚u Student.

public class University { Integer id;

String name;

List<Faculty> facultyList;

}

Tˇr´ıda University obsahuje atributy tabulky University a kolekci objekt˚u Faculty.

(24)

4 MODEL

Vid´ıme, ˇze relace 1:1 se mapuje na kaˇzd´e stranˇe po jedn´e instanci objektu, relace 1:N m´a na jedn´e stranˇe jednu instanci a na druh´e kolekci objekt˚u, no a relace M:N m´a na obou stran´ach kolekci objekt˚u. Na prvn´ı pohled si m˚uˇzeme vˇsimnout rozd´ılu v relac´ıch mezi tabulkami a objekty. Zat´ımco relace mezi tabulkami jsou jednosmˇern´e, tedy ciz´ı kl´ıˇc je pouze v jedn´e tabulce, tak u objekt˚u jsou relace obousmˇern´e a reference na objekt nebo kolekci objekt˚u je na obou stran´ach. Tento fakt je pomˇernˇe z´asadn´ı pˇri ukl´ad´an´ı objekt˚u do datab´aze.

Samozˇrejmˇe je nutn´e dodat dalˇs´ı informace, napˇr´ıklad k jak´e tabulce se entitn´ı tˇr´ıda v´aˇze a k jak´ym sloupc˚um se v´aˇz´ı jednotliv´e atributy nebo jak´e maj´ı sloupce vlastnosti a vztahy. Jedna moˇznost je definovat tyto vlastnosti v XML souboru, ale dnes je mno- hem ˇcastˇejˇs´ı vyuˇz´ıvat anotace. J´a jsem ze sv´eho pˇr´ıkladu z´amˇernˇe anotace vypustil kv˚uli pˇrehlednosti. Entitn´ı tˇr´ıdy v aplikaci SQL Tester anotace obsahuj´ı.

Hibernate je rovnˇeˇz pln´a implementace rozhran´ı JPA (JavaPersistence API). K tomuto

´

uˇcelu jsem jej pouˇzil i j´a. Alternativn´ı implementace je napˇr´ıklad tak´e EclipseLink.

4.2.2 JPA

JPA slouˇz´ı zejm´ena k vytv´aˇren´ı k´od˚u nez´avisl´ych na konkr´etn´ı implementaci a je souˇc´ast´ı specifikace Java EE. Ve v´ysledku tedy program´ator vyuˇz´ıv´a pouze tˇr´ıdy a metody z roz- hran´ı JPA. Jak jsem jiˇz uvedl v kapitole pˇredchoz´ı, tak jsem jako implementaci zvolil Hi- bernate. Ale implementac´ı m˚uˇze existovat v´ıce a nˇekter´a m˚uˇze b´yt v budoucnu napˇr´ıklad rychlejˇs´ı. Pokud m´ame k´od napsan´y v JPA, pak v pˇr´ıpadˇe zmˇeny implementace v˚ubec ne- mus´ıme zasahovat do samotn´e aplikace, ale pouze pˇrid´ame knihovnu s jinou implementac´ı a zmˇen´ıme konfiguraˇcn´ı soubor pro JPA. V k´odu je ovˇsem d˚uleˇzit´e neporuˇsit architekturu programov´an´ı pˇres rozhran´ı a nesm´ıme tedy vyuˇz´ıt ˇz´adnou tˇr´ıdu ani metodu z implemen- tace, tedy napˇr´ıklad z Hibernate. Na obr´azku 5 vid´ıme sch´ema, na kter´em je rozhran´ı JPA nadˇrazeno Hibernate. Hibernate pak d´ale pracuje s API JDBC, JTA a JNDI. V´ıce informac´ı o JPA nalezneme napˇr´ıklad v tutori´alu [10].

4.2.2.1 JPQL

Abychom mohli kromˇe standardn´ıch CRUD operac´ı vytv´aˇret tak´e vlastn´ı dotazy, slouˇz´ı n´am k tomu jazyk JPQL (JavaPersistence Query Language). Program´ator tedy p´ıˇse dotaz v jazyce JPQL, kter´y je podobn´y jazyku SQL a implementace JPA pˇrevede JPQL pr´avˇe na SQL, kter´e se spust´ı v datab´azi. T´ım m´ame zajiˇstˇenu nez´avislost na druhu datab´aze.

(25)

4 MODEL

Obr´azek 5: Sch´ema JPA

JPQL samozˇrejmˇe nepracuje s tabulkami, ale s objekty. Pˇr´ıklad konkr´etn´ıho JPQL dotazu uvid´ıme v kapitole 4.2.3, kde pˇredvedu svoj´ı vlastn´ı tˇr´ıdu. Jak uvid´ıme, nepsal jsem k´od pˇr´ımo v JPA, ale vyuˇzil jsem framework Spring Data JPA.

4.2.3 Spring Data JPA

Kdyˇz program´ator vyuˇz´ıv´a JPA, tak aby si uˇsetˇril pr´aci a ˇsetˇril k´odem, p´ıˇse si takzvan´e ge- nerick´e tˇr´ıdy, kter´e implementuj´ı CRUD operace pro libovoln´y objekt. Tyto generick´e tˇr´ıdy nab´ız´ı framework zvan´y Spring Data JPA, kter´y jsem pro svou aplikaci vyuˇzil. Vyuˇz´ıt´ı fra- meworku Spring Data JPA je vhodn´e zejm´ena v pˇr´ıpadˇe, ˇze program´ator m´a j´ıˇz pˇredchoz´ı zkuˇsenost s technologi´ı JPA. V opaˇcn´em pˇr´ıpadˇe m˚uˇze b´yt jeho pouˇzit´ı naopak pˇr´ıtˇeˇz´ı.

J´a jsem se s JPA jiˇz v praxi setkal a proto jsem si ˇrekl, ˇze se nauˇc´ım pracovat se Spring Data JPA, kter´y mi uspoˇril spoustu ˇr´adk˚u k´odu. Jako hlavn´ı zdroj informac´ı jsem vyuˇzil ofici´aln´ı dokumentaci [21].

Ve vrstvˇe Repository se nach´az´ı pouze rozhran´ı, kter´e implementuje Spring Data JPA.

T´ım, ˇze rozˇs´ıˇr´ıme rozhran´ı JpaRepository z´ısk´ame CRUD operace. M˚uˇzeme rovnˇeˇz vyuˇz´ıt vlastn´ı JPQL dotaz pomoc´ı anotace @Query a framework se za n´as postar´a o implementaci metody. Rovnˇeˇz existuj´ı urˇcit´e n´azvy metod, ze kter´ych Spring Data JPA pozn´a, jakou operaci chceme prov´est. Zde je uk´azka Repository objektu pro entitn´ı tˇr´ıdu Question.

(26)

4 MODEL

@Transactional(readOnly = true)

public interface QuestionRepository extends JpaRepository<Question, Integer> {

List<Question> findByDatabase(Database database);

@Query("SELECT q FROM Question q WHERE q.database.iddatabase = :iddatabase AND q NOT IN (SELECT q FROM Question q LEFT JOIN q.taskList t WHERE t.idtask = :idtask)")

List<Question> findByDatabaseAndTaskNot(@Param("iddatabase") Integer iddatabase, @Param("idtask") Integer idtask);

}

Vid´ıme zde napˇr´ıklad metodu findByDatabase, ze kter´e je patrn´e, ˇze budeme hledat ot´azky podle datab´aze, ke kter´e patˇr´ı. Naproti tomu metoda findByDatabaseAndTaskNot vyuˇz´ıv´a vlastn´ıho JPQL dotazu, do kter´eho se dosad´ı pojmenovan´e parametry. Tak´e vid´ıme, ˇze metody jsou transakˇcnˇe zpracovan´e d´ıky anotaci @Transactional.

4.3 Service

Vrstva Modelu Service obsahuje logiku aplikace a komunikuje s Controllerem. Controller pˇristupuje k t´eto vrstvˇe pˇres rozhran´ı, stejnˇe jako Service pˇristupuje pˇres rozhran´ı k vrstvˇe Repository. V t´eto vrstvˇe se n´am z´asadnˇeji zaˇcne projevovat framework Spring.

4.3.1 Spring

Spring je open-source projekt a jedn´a se o jeden z nejpopul´arnˇejˇs´ıch framework˚u pro v´yvoj Java EE aplikac´ı. M˚uˇzeme d´ıky nˇemu ps´at pˇrehledn´e a jednoduˇse testovateln´e k´ody. Pro bˇeh aplikace ve Springu nav´ıc staˇc´ı vlastnit webov´y server jako je napˇr´ıklad Apache Tomcat a nevyˇzaduje tedy vyuˇzit´ı aplikaˇcn´ıho serveru jako je JBoss. Spring se dˇel´ı na mnoho ˇc´ast´ı.

Vˇsechny nalezneme na ofici´aln´ıch str´ank´ach [19]. Z´akladn´ı Spring m˚uˇze b´yt vyuˇzit pro tvorbu libovoln´e aplikace a d´ıky dalˇs´ım pˇr´ıdavn´ym souˇc´astem je moˇzn´e jej vyuˇz´ıt i pro aplikace webov´e a mobiln´ı. Tak´e ulehˇcuje implementaci n´avrhov´eho vzoru MVC a nab´ız´ı transakˇcn´ı zpracov´an´ı. Alternativn´ı technologi´ı m˚uˇze b´yt EJB (Enterprise Java Beans).

(27)

4 MODEL

4.3.1.1 Dependency Injection

Asi nejzn´amˇejˇs´ı a nejv´yraznˇejˇs´ı funkcionalitou Springu je vyuˇzit´ı n´avrhov´eho vzoru IoC (Inversion of Control). Konkr´etn´ı proveden´ı se naz´yv´a Dependency Injection. V aplikaci m´ame ˇcasto spoustu objekt˚u, kter´e jsou vz´ajemnˇe prov´az´any referencemi. Abychom se nemuseli manu´alnˇe starat o inicializaci objekt˚u v konstruktoru a ˇreˇsit jakou instanci vy- tvoˇr´ıme, m˚uˇzeme tuto ˇcinnost pˇrenechat Springu, kter´y d´ıky tomu, ˇze budeme pouˇz´ıvat rozhran´ı, za bˇehu zajist´ı inicializaci spr´avn´e implementace. To zajist´ı napˇr´ıklad i zno- vupouˇzitelnost k´odu pˇri zmˇenˇe implementace. Z´akladem Springu je kontejner, kter´y se pr´avˇe star´a o vytv´aˇren´ı a spojov´an´ı objekt˚u. Spravuje ˇzivotn´ı cyklus tˇechto objekt˚u od je- jich vytvoˇren´ı aˇz po jejich z´anik. Objekty spravovan´e Springem se naz´yvaj´ı Spring Beans.

Teoreticky je tato ˇc´ast velmi dobˇre pops´ana v tutori´alu [22], ze kter´eho jsem i j´a vych´azel.

4.3.1.2 Aspektovˇe orientovan´e programov´an´ı

Dalˇs´ı v´yraznou souˇc´ast´ı Springu je AOP (Aspect Oriented Programming). Zat´ım co OOP (Object Oriented Programming) ˇclen´ı aplikaci na objekty, AOP j´ı ˇclen´ı na moduly zvan´e aspekty. D´ıky aspekt˚um m˚uˇzeme napˇr´ıklad pˇrid´avat metod´am nˇejakou funkcionalitu nav´ıc pˇred nebo po jejich vykon´an´ı. Nejˇcastˇeji se vyˇz´ıv´a anotac´ı, kter´ymi oznaˇc´ıme metodu, kter´a m´a b´yt obohacena o extern´ı funkcionalitu. Napˇr´ıklad m˚uˇzeme zajistit logov´an´ı vol´an´ı metody. V´yhodou tedy je, ˇze m´ame funkcionalitu na jednom m´ıstˇe a vyuˇzijeme ji na v´ıce m´ıstech. Detailnˇejˇs´ı popis AOP nab´ız´ı [3].

4.3.2 Validace a Verifikace SQL dotazu

Moˇznostmi validace a verifikace SQL dotazu jsem se zab´yval jiˇz v roˇcn´ıkov´em projektu.

Pod´ıv´ame se tedy pouze na zvolen´e ˇreˇsen´ı. Validace je kontrola syntaxe dotazu a verifikace je kontrola jeho funkcionality. Pro validaci dotazu jsem vyuˇzil knihovnu General SQL Parser, kterou jsem doplnil o vlastn´ı funkcionality. Valid´ator zahrnuje n´asleduj´ıc´ı funkce:

• Kontrola syntaxe.

• Kontrola typu dotazu. Napˇr´ıklad vytvoˇren´ı tabulky, ˇcten´ı dat, modifikace dat apod.

• Kontrola nepovolen´ych slov. Vytvoˇril jsem seznam slov, kter´e nesm´ı dotaz obsahovat.

• Kontrola SQL Injection. To znamen´a, ˇze dotaz pro ˇcten´ı dat ˇcte pouze data a nic jin´eho.

(28)

4 MODEL

Dalˇs´ı tˇr´ıdou je spouˇstˇeˇc SQL dotaz˚u. Jelikoˇz se frameworky nehod´ı pro spouˇstˇen´ı dotaz˚u zadan´ych uˇzivatelem, vyuˇzil jsem rozhran´ı JDBC. Kaˇzd´a testovac´ı datab´aze pˇredstavuje jeden ´uˇcet v datab´azi s omezen´ymi pr´avy. Nen´ı tedy moˇzn´e napˇr´ıklad ˇc´ıst nebo modifikovat jin´e datab´aze. N´ıˇze vid´ıme rozhran´ı s metodami, kter´e spouˇst´ı dotazy pro tvorbu tabulek, ˇ

cten´ı dat a modifikaci dat.

public interface SQLRunner extends Serializable {

public String runSelect(String sql) throws NoConnectionException, SQLException;

public boolean hasMoreThanTwoResults(String sql) throws NoConnectionException, SQLException;

public int runDML(List<String> sql) throws NoConnectionException, SQLException;

public boolean runDDL(String sql) throws NoConnectionException, SQLException;

}

Verifik´ator pot´e obsahuje jedinou metodu, kdy se porovn´a student˚uv dotaz se spr´avn´ym ˇreˇsen´ım. Vyuˇzil jsem faktu, ˇze dotazy vrac´ı shodn´a data za pˇredpokladu, ˇze v´ysledkem dotazu n´ıˇze je pr´azdn´a mnoˇzina.

String query = "(" + studentSolution + " MINUS " + teacherSolution + ") UNION ("

+ teacherSolution + " MINUS " + studentSolution + ")";

V relaˇcn´ı algebˇre zaps´ano rovnic´ı (R1 − R2) ∪ (R2 − R1) = ∅. Pˇri splnˇen´ı rovnice jsou relace R1 a R2 shodn´e. Pˇred spuˇstˇen´ım tohoto dotazu ovˇsem nejprve probˇehne kontrola poˇctu sloupc˚u a jejich datov´ych typ˚u.

Posledn´ı ˇc´ast t´eto kapitoly se t´yk´a v´ypisu v´ysledk˚u z datab´aze. Prvn´ı krok je procedura v PL/SQL, coˇz je procedur´aln´ı nadstavba jazyka SQL pro Oracle datab´azi. M˚uˇzeme ji nal´ezt v pˇr´ıloze D. Vrac´ı v´ysledek dotazu ve form´atu XML (Extensible Markup Langu- age). Nicm´enˇe v´ysledek je nutn´e zobrazit v prohl´ıˇzeˇci jako XHTML. K tomu slouˇz´ı techno- logie XSLT (Extensible Stylesheet Language Transformations), kter´a dok´aˇze transformo- vat XML na XHTML. Napsal jsem si tedy vlastn´ı univerz´aln´ı transformaci pro zobrazen´ı v´ysledk˚u z datab´aze ve formˇe XHTML tabulky.

(29)

5 CONTROLLER

5 Controller

Jako Controller slouˇz´ı Spring Beans, kter´e maj´ı tzv. scope specifick´y pro webov´e aplikace.

Scope urˇcuje poˇcet vytvoˇren´ych instanc´ı a dobu platnosti instance objektu. Ve Springu m˚uˇze b´yt scope n´asleduj´ıc´ıho druhu:

• Singleton - Existuje pouze jedna instance, jedn´a se o v´ychoz´ı nastaven´ı.

• Prototype - Existuje v´ıce instanc´ı.

• Request - Obdoba HTTP dotazu, instance spolu s dotazem zanik´a.

• Session - Obdoba HTTP session, instance spolu se session zanik´a.

• Global Session - Obdoba glob´aln´ı HTTP session, instance spolu se session zanik´a.

J´a jsem si vytvoˇril i vlastn´ı scope implementac´ı rozhran´ı Scope. Konkr´etnˇe se jednalo o scope zvan´y View. Ten m´a platnost po dobu zobrazen´ı str´anky v prohl´ıˇzeˇci. Dalˇs´ı Scope by mohl b´yt napˇr´ıklad Flash, kter´y m´a platnost 2 HTTP dotazy, ale rovnˇeˇz bychom si jej museli implemetovat sami. Nyn´ı se pod´ıv´ame na definici konkr´etn´ıho Beanu.

@Component("solutionBean")

@Scope("session")

public class SolutionBean implements Serializable {

}

Vid´ıme, ˇze komponentu jsme pojmenovali solutionBean a m´a scope session. N´azev n´am bude pozdˇeji slouˇzit pro pˇr´ıstup z View (komponenta MVC). V t´eto tˇr´ıdˇe pot´e uˇz m˚uˇzeme m´ıt metody pˇr´ıstupn´e z View, kter´e budou pracovat s vrstvou Service nebo budou pˇred´avat View data pro zobrazen´ı. Metody by samozˇrejmˇe mˇely b´yt spustiteln´e pouze uˇzivatelem s pˇr´ısluˇsn´ym opr´avnˇen´ım. O bezpeˇcnosti se dozv´ıme v´ıce v kapitole 7. Nˇekdy se tyto Beany oznaˇcuj´ı jako Model, protoˇze udrˇzuj´ı data k zobrazen´ı, ale mysl´ım si, ˇze pokud data z´ısk´avaj´ı z Modelu a neobsahuj´ı ˇz´adnou logiku, jedn´a se o Controllery. Jak jsme jiˇz ˇ

cetli v kapitole 2.5, neexistuje ˇz´adn´a definice jak implementovat MVC a vˇzdy z´aleˇz´ı na pouˇzit´ych technologi´ıch a pˇr´ıstupu. Nav´ıc v´yvojov´a prostˇred´ı ˇcasto umoˇzˇnuj´ı vygenerov´an´ı k´odu a NetBeans rovnˇeˇz tyto objekty naz´yv´a Controllery. S View m˚uˇzeme pracovat tak´e z Controlleru pomoc´ı tˇr´ıd RequestContext a FacesContext, viz dokumentace [20] a [6].

(30)

6 VIEW

6 View

6.1 JSF

JSF (JavaServer Faces) je framework pro zjednoduˇsen´ı tvorby uˇzivatelsk´eho rozhran´ı ve webov´ych aplikac´ıch. D´ale tak´e usnadˇnuje pouˇzit´ı n´avrhov´eho vzoru MVC a vytvoˇren´ı ˇsablonovac´ıho syst´emu. Dˇr´ıve se pouˇz´ıvala technologie JSP, ale dnes pˇrevl´ad´a technologie JSF, ve kter´e program´ator p´ıˇse tzv. facelety. Z´akladn´ı nastaven´ı se nach´az´ı v souborech faces-config.xml a web.xml. Nyn´ı se pod´ıv´ame na konkr´etn´ı pˇr´ıklad JSF tagu.

<h:outputText value="Hello World!" />

Tento pˇr´ıklad by mˇel v´est k vyrendrov´an´ı HTML.

<span>Hello World!</span>

Ve v´ychoz´ım nastaven´ı tento tag zajiˇst’uje escapov´an´ı speci´aln´ıch znak˚u. Pro zajiˇstˇen´ı uˇzivatelsky pˇr´ıvˇetiv´eho rozhran´ı je tak´e d˚uleˇzit´a podpora technologie AJAX. Ve faceletu se komunikuje s Controllerem pomoc´ı EL (Expression Language) v´yraz˚u. Pˇredchoz´ı pˇr´ıklad bychom mohli upravit n´asledovnˇe.

<h:outputText value="#{solutionBean.question}" />

Zivotn´ı cyklus JSF aplikace obsahuje 6 ˇˇ c´ast´ı:

• JSF po obdrˇzen´ı HTTP dotazu zaˇcne vytv´aˇret komponenty a pˇridˇel´ı jim handlery a valid´atory. Pot´e je uloˇz´ı do FacesContextu.

• Aktualizuje hodnoty komponent na z´akladˇe parametr˚u v dotazu.

• Hodnoty validuje v˚uˇci valid´ator˚um, kter´e jsou ke komponent´am pˇriˇrazeny.

• Uloˇz´ı hodnoty do promˇenn´ych v Controlleru. Samozˇrejmˇe za pˇredpokladu, ˇze validace probˇehne ´uspˇeˇsnˇe.

• Zpracuje poˇzadavek od uˇzivatele, napˇr´ıklad zpracov´an´ı odeslan´eho formul´aˇre pˇr´ısluˇsnou metodou.

• Vykresl´ı odpovˇedi vˇcetnˇe pˇr´ıpadn´ych zpr´av o chyb´ach.

Vych´azel jsem z v´yukov´eho materi´alu [12] a tutori´alu [11].

(31)

6 VIEW

6.2 PrimeFaces

Primefaces je open-source sada JSF komponent s mnoha rozˇs´ıˇren´ımi. Dalo by se ˇr´ıci, ˇze se jedn´a o JSF framework. D´ıky PrimeFaces komponent´am m˚uˇzeme vytv´aˇret tzv. rich GUI neboli uˇzivatelsky bohat´e rozhran´ı, kter´e je uˇzivatelsky pˇr´ıvˇetiv´e. M˚uˇze obsahovat napˇr´ıklad HTLM editor, dialogy nebo grafy. Existuje tak´e velk´e mnoˇzstv´ı pˇrednastaven´ych vzhled˚u a je moˇzn´e si d´ıky aplikaci [25] vytvoˇrit vlastn´ı. Nebo m˚uˇzeme upravit CSS tˇr´ıdy, coˇz jsem udˇelal ve sv´e aplikaci i j´a. Jako pˇr´ıklad PrimeFaces slouˇz´ı obr´azek 6. Konkr´etnˇe se jedn´a o tabulku uˇzivatel˚u, kter´a nab´ız´ı funkce str´ankov´an´ı, ˇrazen´ı a filtrov´an´ı. V´ıce obr´azk˚u nalezneme v pˇr´ıloh´ach E, F,G, H a I.

Obr´azek 6: Tabulka uˇzivatel˚u v PrimeFaces

Alternativou k PrimeFaces mohou b´yt RichFaces nebo IceFaces. V dneˇsn´ı dobˇe jsou su- ver´enˇe nejpopul´arnˇejˇs´ı PrimeFaces a obsahuj´ı tak´e nejv´ıce komponent. Porovn´an´ı vyuˇzit´ı tˇechto framework˚u nab´ız´ı napˇr´ıklad [2]. Z firem, kter´e pouˇz´ıvaj´ı PrimeFaces bych vyjme- noval Siemens, Cisco, Intel, Ford, Mercedes-Benz, Volvo, Boeing, eBay, Dell, Xerox nebo HP. Seznam firem lze nal´ezt na ofici´aln´ıch str´ank´ach [16]. Samotn´ı v´yvoj´aˇri Springu do- poruˇcuj´ı jako JSF framework v kombinaci se Springem pr´avˇe PrimeFaces, jak uv´ad´ı [17].

Informace jsem ˇcerpal pˇredevˇs´ım z ofici´aln´ı dokumentace [18], kter´a je velice pˇeknˇe zpraco- van´a. Tak´e jsem vyuˇzil pˇr´ıdavnou knihovnu PrimeFaces Extensions. Pˇr´ıkladem PrimeFaces je n´asleduj´ıc´ı k´od, kter´y se postar´a o vytvoˇren´ı dialogov´eho okna.

<p:dialog closeOnEscape="true" widgetVar="createDialog" modal="true"

showEffect="slide" hideEffect="slide" resizable="false" >

</p:dialog>

(32)

6 VIEW

6.3 PrettyFaces

PrettyFaces je open-source ˇreˇsen´ı pro pˇrepisov´an´ı URL v JSF aplikac´ıch. Pˇrepisov´an´ı na hezky ˇcitelnou URL se hod´ı pˇredevˇs´ım pro SEO (Search Engine Optimization), tedy opti- malizaci pro vyhled´avaˇce. Konfigurace se nach´az´ı v souboru pretty-config.xml. Pˇr´ıkladem pˇreps´an´ı URL m˚uˇze b´yt zmˇena adresy z /sqltester/public/login/form.xhtml na /sqltes- ter/login. Doc´ıl´ıme toho pomoc´ı n´asleduj´ıc´ı konfigurace.

<url-mapping id="login">

<pattern value="/login" />

<view-id value="/public/login/form.xhtml" />

</url-mapping>

Dalˇs´ı zp˚usoby vyuˇzit´ı m˚uˇzeme nal´ezt na ofici´aln´ıch str´ank´ach [15].

6.4 Sablona ˇ

Pro modern´ı dynamick´e aplikace je samozˇrejmost´ı vyuˇzit´ı ˇsablon. Do glob´aln´ı ˇsablony v aplikaci spad´a z´ahlav´ı s menu, ˇc´ast pro obsah a z´apat´ı. Do hlaviˇcky se vˇzdy vkl´ad´a titulek a do obsahu se vkl´ad´a cel´e tˇelo str´anky. V ˇsablonˇe s n´azvem template.xhtml se vkl´ad´a obsah n´asledovnˇe.

<ui:insert name="content" >Content</ui:insert>

Pot´e vytvoˇr´ıme str´anku, kter´a tuto ˇsablonu bude vyuˇz´ıvat.

<ui:composition template="/WEB-INF/layout/template.xhtml">

A nakonec vloˇz´ıme obsah na patˇriˇcn´e m´ısto.

<ui:define name="content" ></ui:define>

Niˇzˇs´ı ´uroveˇn ˇsablon je dle m´eho n´azoru samotn´e dynamick´e vkl´ad´an´ı obsahu z datab´aze tedy napˇr´ıklad n´asleduj´ıc´ı k´od.

<h:outputText value="#{user.surname}" />

(33)

6 VIEW

6.5 Chybov´ e str´ anky

K profesion´aln´ı aplikaci urˇcitˇe patˇr´ı vytvoˇren´ı vlastn´ıch chybov´ych str´anek, kter´e maj´ı uˇzivatele informovat o chybˇe a nab´ıdnout mu cestu na funkˇcn´ı str´anku. Chyba vˇzdy obsa- huje stavov´y k´od protokolu HTTP a popis stavu. K´ody zaˇc´ınaj´ıc´ı ˇc´ıslic´ı 1 jsou informaˇcn´ıho charakteru, 2 znamen´a ´uspˇeˇsn´e zpracov´an´ı poˇzadavku, 3 pˇresmˇerov´an´ı, 4 klientsk´e chyby a 5 serverov´e chyby. ˇCasto se vytv´aˇr´ı vlastn´ı str´anky alespoˇn pro n´asleduj´ıc´ı k´ody a i j´a jsem je vytvoˇril. Uk´azka str´anky se nach´az´ı v pˇr´ıloze J.

• 401 – Selh´an´ı autentizace nebo autorizace, napˇr´ıklad ˇspatn´e pˇrihlaˇsovac´ı ´udaje.

• 403 – Pˇr´ıstup zam´ıtnut, uˇzivatel napˇr´ıklad nem´a dostateˇcn´a opr´avnˇen´ı zobrazit ob- sah.

• 404 – Str´anka nenalezena, zadan´a URL neodkazuje na existuj´ıc´ı zdroj.

• 500 – Intern´ı chyba serveru, neoˇcek´avan´a chyba pˇri zpracov´an´ı dotazu na stranˇe serveru.

• 503 – Nedostupn´a sluˇzba, napˇr´ıklad je server v ´udrˇzbˇe.

6.6 Resources

Ke kaˇzd´e webov´e aplikaci patˇr´ı kromˇe HTML tak´e dalˇs´ı soubory jako CSS, javascript, obr´azky apod. Pro uloˇzen´ı tˇechto soubor˚u slouˇz´ı sloˇzka resources. J´a osobnˇe dˇel´ım tuto sloˇzku d´ale jeˇstˇe na sloˇzky css, js, images, icons a fonts. Mezi CSS m´am kromˇe ˇc´asti vlastn´ıho vzhledu i CSS knihovnu Twitter Bootstrap. S jej´ı pomoc´ı jsem vytvoˇril napˇr´ıklad i z´ahlav´ı str´anky, ve kter´em se nach´az´ı hlavn´ı menu. Uk´azka z´ahlav´ı je na obr´azku 7.

Obr´azek 7: Z´ahlav´ı str´anky s logem a menu

Ve sloˇzce js se nach´az´ı javascriptov´e soubory. Musel jsem v nˇekter´ych pˇr´ıpadech trochu poupravit chov´an´ı JSF a PrimeFaces komponent. Jedn´a se o frameworky, kter´e mus´ı b´yt univerz´aln´ı a tud´ıˇz ne vˇzdy n´am mus´ı vyhovovat jejich z´akladn´ı funkcionalita. D´ale jsem

(34)

6 VIEW

vytvoˇril tlaˇc´ıtko pro rychl´y n´avrat na zaˇc´atek str´anky a tak´e jsem pomoc´ı javascriptu vyˇreˇsil lokalizaci chybov´ych str´anek, protoˇze odesl´an´ı nov´eho dotazu pro zmˇenu jazyka by smazalo pˇredchoz´ı chybov´y stav. V aplikaci se nach´az´ı nˇekolik obr´azk˚u. K vytvoˇren´ı favikony jsem vyuˇzil gener´ator [7]. K vytvoˇren´ı loga jsem vyuˇzil n´astroj [5], pˇriˇcemˇz jsem jej upravil v grafick´em editoru Gimp a pro textovou ˇc´ast loga jsem vyuˇzil bezplatn´eho fontu Roboto. Vlajeˇcky pro zmˇenu jazyka jsem pˇrevzal ze zdroje [1]. Ikonky pro export statistik jsem vytvoˇril s´am. Posledn´ı obr´azek se nach´az´ı ve spouˇstˇen´ı dotaz˚u a pˇredstavuje datab´azi. Najdeme jej i v pˇr´ıloze I. Ten mi vytvoˇrila ˇsikovn´a grafiˇcka Monika Jarol´ımov´a, kter´a mi rovnˇeˇz dala nˇekolik cenn´ych rad ohlednˇe celkov´eho vzhledu a pomohla mi vytvoˇrit sch´emata do t´eto zpr´avy. Za to j´ı t´ımto dˇekuji. Vˇsechny obr´azky je moˇzn´e vyuˇz´ıt pro soukrom´e i komerˇcn´ı ´uˇcely bez nutnosti uv´adˇet p˚uvod obr´azk˚u.

6.7 Lokalizace

Do aplikace jsem integroval moˇznost volby jazyka. Jako prim´arn´ı jazyk je nastaven´a ˇceˇstina.

D´ale je moˇzn´e rozhran´ı pˇrepnout do slovenˇstiny a angliˇctiny. Jsou to jazyky, do kter´ych jsem byl schopn´y ˇcesk´y text pˇreloˇzit. Nicm´enˇe d´ıky jiˇz hotov´e implementaci pˇrep´ın´an´ı jazyk˚u je pˇrid´an´ı dalˇs´ıho jazyka pomˇernˇe jednoduch´e. Tato moˇznost by se mohla vyuˇz´ıt zejm´ena, pokud bychom se rozhodli v budoucnu aplikaci zpˇr´ıstupnit veˇrejnosti. Na obr´azku 8 vid´ıme v z´apat´ı str´anky vlajeˇcky. Pod´ıv´ame se, jak se takov´a lokalizace v JSF vytv´aˇr´ı.

Obr´azek 8: Z´apat´ı str´anky s vlajeˇckami

Vytvoˇr´ıme ve sloˇzce resources takzvan´y message bundle. Jedn´a se o soubory s n´azvy messages_cs.properties, messages_sk.properties a messages_en.properties. Samozˇrejmˇe se jedn´a o jinou sloˇzku resources, neˇz se kterou jsme se setkali v kapitole 6.6. V kaˇzd´em souboru je uveden kl´ıˇc a k nˇemu hodnota. V aplikaci jako takov´e potom pouˇzijeme kl´ıˇc, za kter´y se dosad´ı hodnota z pˇr´ısluˇsn´eho souboru podle pr´avˇe zvolen´eho jazyka.

MENU_TOOLS=Nastaven´ı MENU_TOOLS=Nastavenie MENU_TOOLS=Tools

(35)

6 VIEW

Message bundle je potˇreba zaregistrovat v konfiguraˇcn´ım souboru faces-config.xml a vy- tvoˇrit session objekt pro udrˇzov´an´ı a zmˇenu aktu´aln´ıho jazyka. Zde je uk´azka konfiguraˇcn´ıho souboru.

<locale-config>

<default-locale>cs</default-locale>

<supported-locale>cs</supported-locale>

<supported-locale>en</supported-locale>

<supported-locale>sk</supported-locale>

</locale-config>

<message-bundle>cz.tul.fm.sqltester.locale.messages</message-bundle>

<resource-bundle>

<base-name>cz.tul.fm.sqltester.locale.messages</base-name>

<var>msg</var>

</resource-bundle>

Metoda v objektu pro zmˇenu jazyka do slovenˇstiny m˚uˇze vypadat napˇr´ıklad takto.

public void changeLocaleToSk() { locale = "sk";

FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(locale));

}

(36)

7 ZABEZPE ˇCEN´I

7 Zabezpeˇ cen´ı

7.1 HTTPS

HTTPS je protokol, kter´y je podobn´y protokolu HTTP s t´ım rozd´ılem, ˇze pˇren´aˇsen´a data ˇsifruje. V bˇeˇzn´em HTTP se data odes´ılaj´ı v textovˇe ˇciteln´e podobˇe vˇcetnˇe hesel. Samotn´e ˇsifrov´an´ı v HTTPS zajiˇst’uje protokol TLS (Transport Layer Security). Jedn´a se o asyme- trickou ˇsifru, kdy kaˇzd´a strana vlastn´ı priv´atn´ı a veˇrejn´y kl´ıˇc. U serveru je samozˇrejmˇe nutn´e ovˇeˇrit certifik´at. Certifik´at je ovˇeˇren´y certifikaˇcn´ı autoritou a ta je ovˇeˇrena jinou certifikaˇcn´ı autoritou. Koneˇcn´a autorita se naz´yv´a koˇrenov´a certifikaˇcn´ı autorita a jej´ı kl´ıˇc je uloˇzen v uloˇziˇsti, tedy napˇr´ıklad v prohl´ıˇzeˇci.

7.1.1 Certifik´at

Pro vyuˇzit´ı HTTPS je nutn´e vlastnit certifik´at. Jedn´a se o veˇrejn´y kl´ıˇc, kter´y je podepsan´y certifikaˇcn´ı autoritou. Pod´ıv´ame se na postup vytvoˇren´ı certifik´atu pro ˇskoln´ı server, kter´y jsem zajistil. Nejprve je nutn´e vygenerovat kl´ıˇc priv´atn´ı a k nˇemu ˇz´adost o elektronick´y pod- pis. Pot´e je nutn´e vytvoˇrit konfiguraˇcn´ı soubor pro vygenerov´an´ı priv´atn´ıho kl´ıˇce a ˇz´adosti o certifik´at.

default_bits = 2048

distinguished_name = req_distinguished_name string_mask = nombstr

prompt = no

req_extensions = req_ext [req_distinguished_name]

countryName = CZ

organizationName = Technicka univerzita v Liberci commonName = rysy.mti.tul.cz

[req_ext]

subjectAltName = @san [san]

DNS.0 = rysy.mti.tul.cz

Tento soubor nazveme napˇr´ıklad server-req.cfg a bude n´am slouˇzit jako vsutp pro funkci knihovny openssl.

(37)

7 ZABEZPE ˇCEN´I

openssl req -new -keyout serverkey.pem -out serverreq.pem -config server-req.cfg

T´ımto pˇr´ıkazem z´ısk´ame priv´atn´ı kl´ıˇc serverkey.pem a ˇz´adost o certifik´at serverreq.pem, kterou odeˇsleme CESNETU pomoc´ı formul´aˇre na str´ance [28]. CESNET zaˇr´ıd´ı certifik´at, kter´y si budeme moci pot´e st´ahnout. Jelikoˇz pouˇz´ıv´ame Javu, je nutn´e priv´atn´ı kl´ıˇc spolu s certifik´atem pˇrev´est do form´atu pro Javu. Jedn´a se o form´at JKS. Pˇr´ım´y pˇrevod z form´atu PEM nefunguje. Je tedy nutn´e pˇrev´est form´at PEM na form´at PKCS12 a ten posl´eze na form´at JKS. Vyuˇzijeme opˇet knihovnu openssl. N´asleduj´ıc´ım pˇr´ıkazem z´ısk´ame form´at PKCS12.

openssl pkcs12 -export -inkey serverkey.pem -in servercert.pem -name nazev -out keystore.p12

Nyn´ı m˚uˇzeme n´aˇs keystore.p12 pˇrev´est na poˇzadovan´y JKS. K tomu slouˇz´ı Java n´astroj KeyTool. Nach´az´ı se v bˇeˇzn´e instalaci Javy. N´asleduj´ıc´ı pˇr´ıkaz pˇrevod zajist´ı.

keytool -importkeystore -srckeystore neystore.p12 -srcstoretype pkcs12 -srcalias nazev -destkeystore keystore.jks

-deststoretype jks -deststorepass heslo -destalias nazev

N´avod˚u jak pˇrev´est form´at PEM na JKS je mnoho, nicm´enˇe po nˇekolika nejr˚uznˇejˇs´ıch po- kusech jsem zjistil, ˇze v´yˇse uveden´y postup je jedin´y skuteˇcnˇe funkˇcn´ı. Soubor n´am poslouˇz´ı pro zprovoznˇen´ı HTTPS na webov´em serveru Tomcat a z´aroveˇn pro zprovoznˇen´ı Shibbo- lethu. V souboru server.xml je nutn´e poupravit ´udaje pro HTTPS. Staˇc´ı odkomentovat jiˇz existuj´ıc´ı konfiguraci a pˇridat cestu k souboru keystore.jks a heslo.

7.2 Spring security

Spring Security je pˇr´ıdavn´a souˇc´ast frameworku Spring. Poskytuje komplexn´ı zabezpeˇcen´ı pro Java EE aplikace. Zabezpeˇcen´ı je konfigurovateln´e a tak si kaˇzd´y m˚uˇze zvolit speci- fickou konfiguraci pro sv˚uj syst´em. Nab´ız´ı napˇr´ıklad funkce pro autentizaci a autorizaci uˇzivatel˚u nebo ochranu pˇred r˚uzn´ymi ´utoky. Autentizace je ovˇeˇren´ı uˇzivatele. Ovˇeˇren´ı prob´ıh´a nejˇcastˇeji prostˇrednictv´ım jm´ena a hesla. Autorizace je ovˇeˇren´ı pr´av uˇzivatele.

Napˇr´ıklad zda m˚uˇze prov´est poˇzadovanou akci. K tomu slouˇz´ı nejˇcastˇeji uˇzivatelsk´e role.

Jako hlavn´ı zdroj informac´ı jsem opˇet vyuˇzil ofici´aln´ı dokumentaci, viz [23].

(38)

7 ZABEZPE ˇCEN´I

7.3 Autentizace uˇ zivatel˚ u

Mezi autentizaˇcn´ı mechanismy patˇr´ı napˇr´ıklad n´asleduj´ıc´ı moˇznosti:

• Anonymn´ı ovˇeˇren´ı - Ovˇeˇren´ı anonymn´ıho uˇzivatele ˇz´adnou autentizaci nevyˇzaduje.

Nˇekter´e str´anky v aplikaci je moˇzn´e nechat zobrazit libovoln´emu uˇzivateli.

• HTTP Basic - Jedn´a se metodu, kdy se jm´eno a heslo uˇzivatele uloˇz´ı do cache pamˇeti a odeˇsle se v hlaviˇcce kaˇzd´eho HTTP dotazu. Implementace je zpravidla velice rychl´a, protoˇze prohl´ıˇzeˇce obsahuj´ı vlastn´ı formul´aˇr pro pˇrihl´aˇsen´ı uˇzivatele, nicm´enˇe je nutn´e pˇredpokl´adat zabezpeˇcenou komunikaci mezi klientem a serverem. Tento zp˚usob au- tentizace se vyuˇz´ıv´a napˇr´ıklad u nastaven´ı s´ıt’ov´ych prvk˚u jako jsou routery.

• Formul´aˇrov´e ovˇeˇren´ı - Lepˇs´ı variantou je vytvoˇrit vlastn´ı pˇrihlaˇsovac´ı formul´aˇr, data od uˇzivatele zpracovat a informaci o jeho pˇrihl´aˇsen´ı udrˇzovat na serveru. Pro zajiˇstˇen´ı bezpeˇcnosti je nutn´e vyuˇz´ıt protokol HTTPS.

• LDAP - Jedn´a se o datab´azi se stromovou strukturou. Uˇzivatele a informace o nich ukl´ad´a do adres´aˇrov´e struktury. Ovˇeˇren´ı uˇzivatele v˚uˇci LDAP datab´azi je pomˇernˇe bˇeˇzn´e a pˇr´ıvˇetiv´e. ˇSkola sice LDAP datab´azi vlastn´ı, ale od nˇejak´e doby k n´ı ned´av´a pˇr´ıstup, i kdyˇz si mysl´ım, ˇze by to pro mˇe byla pomˇernˇe dobr´a varianta autentizace uˇzivatel˚u. Konfigurace je ve Spring Security pomˇernˇe jednoduch´a.

• OpenID - Umoˇzˇnuje nechat autentizaci uˇzivatele na extern´ı aplikaci. Extern´ı aplikac´ı m˚uˇze b´yt napˇr´ıklad Google nebo mojeID. Uˇzivatel se tak pˇrihl´as´ı ke sv´emu Google

´

uˇctu a t´ım potvrd´ı svou autenticitu.

• SSO (Single Sign-On) - Jedn´a se o sluˇzbu jednotn´eho pˇrihl´aˇsen´ı. Uˇzivatel se pˇrihl´as´ı na jedn´e jedin´e sluˇzbˇe, ˇc´ımˇz z´ısk´a pˇrihl´aˇsen´ı na vˇsech sluˇzb´ach, kter´e tento mecha- nismus vyuˇz´ıvaj´ı. SSO tvoˇr´ı poskytovatel identity a poskytovatel sluˇzeb. Pˇr´ıkladem m˚uˇze b´yt Shibboleth.

• Zapamatov´an´ı uˇzivatele - Informace o posledn´ım ´uspˇeˇsn´em pˇrihl´aˇsen´ı se uloˇz´ı na lok´aln´ım poˇc´ıtaˇci uˇzivatele do tzv. cookies. Pot´e jiˇz staˇc´ı pˇreˇc´ıst cookie a zjistit, zda m´a uˇzivatel platn´e pˇrihl´aˇsen´ı.

Pro aplikaci SQL tester jsem pro nˇekter´e str´anky zvolil pˇr´ıstup anonymn´ıho uˇzivatele, pro administr´atorsk´y ´uˇcet vyuˇz´ıv´am vlastn´ı formul´aˇr a pro ostatn´ı uˇzivatele Shibboleth. Pˇres

(39)

7 ZABEZPE ˇCEN´I

Shibboleth se mohou pˇrihl´asit studenti a uˇcitel´e. Pokud by se aplikace v budoucnu otevˇrela veˇrejnosti, pˇridal bych i OpenID.

7.4 Shibboleth

Shibboleth je open-source projekt, kter´y nab´ız´ı sluˇzbu SSO. Umoˇzˇnuje tedy uˇzivateli po- moc´ı jednoho pˇrihl´aˇsen´ı pˇr´ıstup k v´ıce aplikac´ım. Mezi organizace, kter´e vyuˇz´ıvaj´ı Shib- boleth patˇr´ı pˇredevˇs´ım univerzity. Patˇr´ı mezi nˇe i TUL. SSO syst´em obsahuje celkem 4 prvky.

• Webov´y prohl´ıˇzeˇc – Pˇredstavuje uˇzivatele v r´amci procesu SSO.

• Zdrojov´a data – Obsahuj´ı chr´anˇen´y obsah, kter´y chce uˇzivatel zobrazit.

• Identity Provider (IdP) – Poskytovatel ovˇeˇren´ı, ovˇeˇruje uˇzivatele. Napˇr´ıklad Shibbo- leth.

• Service Provider (SP) – Poskytovatel sluˇzby, dotazuje se IdP na ovˇeˇren´ı. Napˇr´ıklad SQL Tester.

Komunikace a v´ymˇena dat mezi IdP a SP prob´ıh´a prostˇrednictv´ım zpr´av v jazyce SAML (Security Assertion Markup Language). ´Udaje o uˇzivatel´ıch jsou pˇred´av´any ve formˇe meta- dat, coˇz je XML soubor splˇnuj´ıc´ı pr´avˇe SAML standard. Ke komunikaci je rovnˇeˇz potˇreba protokol TLS a metadata mus´ı obsahovat veˇrejn´y kl´ıˇc. K tomu vyuˇzijeme n´aˇs certifik´at, kter´y zajiˇst’uje i HTTPS. Samotn´y SSO proces pak prob´ıh´a v 5 kroc´ıch:

1. Uˇzivatel pˇristupuje ke zdroji - Pokud je v bezpeˇcnostn´ım kontextu aplikace informace o jiˇz pˇrihl´aˇsen´em uˇzivateli, potom je uˇzivateli pˇr´ıstup umoˇznˇen. V opaˇcn´em pˇr´ıpadˇe je poˇzadavek na autentizaci pˇresmˇerov´an na server IdP s c´ılem zah´ajit SSO.

2. Pˇrihl´aˇsen´ı uˇzivatele u IdP - Pokud m´a uˇzivatel u IdP existuj´ıc´ı relaci, pokraˇcuje se dalˇs´ım krokem. V opaˇcn´em pˇr´ıpadˇe ovˇeˇr´ı IdP uˇzivatele prostˇrednictv´ım jm´ena a hesla.

3. IdP pˇripravuje autentizaˇcn´ı odpovˇed’ - Po identifikaci uˇzivatele IdP pˇriprav´ı auten- tizaˇcn´ı odpovˇed’ ve formˇe SAML zpr´avy a odeˇsle ji. Uˇzivatele odeˇsle zpˇet na SP.

(40)

7 ZABEZPE ˇCEN´I

4. SP kontroluje autentizaˇcn´ı odpovˇed’ - SP ovˇeˇr´ı odpovˇed’ a zmˇen´ı informace o aktu´alnˇe pˇrihl´aˇsen´em uˇzivateli.

5. Zdroj vrac´ı obsah - Stejnˇe jako v kroku 1 je uˇzivatel ovˇeˇren v˚uˇci bezpeˇcnostn´ımu kontextu. Tentokr´at uˇz je ovˇsem pˇrihl´aˇsen´y a je mu chr´anˇen´y obsah k dispozici.

R´ad bych zm´ınil, ˇze jsem 25. ledna 2015 zveˇrejnil na str´ank´ach Wikipedie ˇcesk´y ˇcl´anek o Shibbolethu, viz [26]. ˇCl´anek jsem pˇridal pod ´uˇctem JakubVenglar. Sepsat ˇcl´anek bylo souˇc´ast´ı z´apoˇctu z pˇredmˇetu Poˇc´ıtaˇcov´a bezpeˇcnost. Jelikoˇz jsem se v bakal´aˇrsk´e pr´aci tou dobou zab´yval Shibbolethem, pouˇzil jsem podobn´y text i pro vytvoˇren´ı ˇcl´anku na Wikipedii. ˇCl´anek na Wikipedii tedy vznikl na z´akladˇe t´eto pr´ace.

7.5 Spring SAML

V kapitole 7.4 jsem zm´ınil, ˇze Shibboleth komunikuje prostˇrednictv´ım protokolu SAML.

Abychom s n´ım mohli komunikovat, vyuˇzijeme knihovnu Spring SAML, kter´a spolupracuje se Spring Security. Zvl´ad´a pˇripojen´ı k IdP, generov´an´ı metadat, z´ısk´an´ı atribut˚u uˇzivatele a vˇse potˇrebn´e k implementaci SSO. V konfiguraˇcn´ım souboru je nutn´e nastavit cestu a heslo k certifik´atu plus metadata IdP, coˇz je v naˇsem pˇr´ıpadˇe Shibboleth. Vyuˇzil jsem kon- figuraˇcn´ıho souboru z uk´azkov´e aplikace [24], kter´y jsem poupravil dle vlastn´ıch poˇzadavk˚u.

7.6 Ochrana proti 10 nejˇ castˇ ejˇ s´ım rizik˚ um podle OWASP

V t´eto kapitole se pokus´ım nast´ınit 10 nejzn´amˇejˇs´ıch bezpeˇcnostn´ıch rizik pro webov´e aplikace. U kaˇzd´eho rizika rovnˇeˇz uv´ad´ım druhy ochran v aplikaci SQL Tester. Vych´azel jsem ze seznamu organizace OWASP [14].

7.6.1 SQL Injection

SQL Injection je technika, kdy ´utoˇcn´ık pomoc´ı formul´aˇre modifikuje vykon´avan´y SQL dotaz a pˇrid´a do nˇej vlastn´ı SQL pˇr´ıkaz. Napˇr´ıklad bychom na serveru mˇeli n´asleduj´ıc´ı SQL dotaz.

sql = "SELECT * FROM Users WHERE UserId = " + txtUserId;

(41)

7 ZABEZPE ˇCEN´I

Tento pˇr´ıkaz by mˇel vr´atit maxim´alnˇe jednoho uˇzivatele. Pˇredpokl´ad´ame, ˇze UserId je unik´atn´ı identifik´ator uˇzivatele. Parametr txtUserId pˇrevezmeme od uˇzivatele pomoc´ı for- mul´aˇrov´eho pole. Uˇzivatel zad´a napˇr´ıklad 125 or 1=1. Nyn´ı se pod´ıv´ame na pˇr´ıkaz, kter´y se vykon´a.

SELECT * FROM Users WHERE UserId = 125 or 1=1;

Takov´y dotaz uˇz z´ısk´a vˇsechny uˇzivatele z datab´aze. Proti SQL Injection se d´a br´anit pa- rametrizovan´ymi dotazy. Dotaz se tedy nespojuje pomoc´ı ˇretˇezc˚u, ale vloˇz´ı se do nˇej para- metry, kter´e budou parsov´any jako hodnoty. Parametrizovan´e dotazy vyuˇz´ıv´am i v aplikaci SQL Tester. N´ıˇze je uk´azka k´odu, kde je dotazu pˇred´an parametr role.

@Query("SELECT u FROM User u WHERE u.role.name = :role") public List<User> findByRoleName(@Param("role") String role);

7.6.2 Odcizen´ı hesel a spr´ava sessions

Utoˇ´ cn´ık se pokouˇs´ı napˇr´ıklad deˇsifrovat z´ıskan´e heslo nebo jej vid´ı v ˇciteln´e podobˇe. Proto je v aplikaci SQL Tester heslo pro administr´atorsk´y ´uˇcet vytvoˇreno funkc´ı bcrypt. Heslo je tedy zaˇsifrovan´e a je k nˇemu pˇrid´ana tzv. s˚ul. To je ˇretˇezec, kter´y se pˇripoj´ı k heslu pˇred samotn´ym ˇsifrov´an´ım. Je tedy velice obt´ıˇzn´e p˚uvodn´ı heslo deˇsifrovat. Ostatn´ı uˇzivatel´e se autentizuj´ı pomoc´ı Shibbolethu, takˇze zde moje aplikace nehraje roli. Komunikace s Shi- bbolethem prob´ıh´a pˇres HTTPS. Podvrˇzen´ı autorizace ˇci autentizace uˇzivatele lze prov´est z´ısk´an´ım session ID. Nˇekter´e aplikace jej zas´ılaj´ı v URL. Na serveru jsem tuto moˇznost za- mezil a lze session ID pˇred´avat pouze pomoc´ı cookies. Nav´ıc pˇri nov´em pˇrihl´aˇsen´ı uˇzivatele se vˇsechny sessions vytvoˇr´ı znovu a star´e se zneplatn´ı. Toho jsem dos´ahl prostˇrednictv´ım konfigurace Spring Security. Posledn´ı ochrana proti t´eto zranitelnosti je platnost sessions po dobu 30 minut. Cookies je tak´e moˇzn´e zas´ılat pouze prostˇrednictv´ım HTTPS. Nelze je tedy odcizit napˇr´ıklad javascriptem.

7.6.3 XSS

XSS (Cross-site scripting) je ´utok, pˇri nˇemˇz na str´ance zobraz´ıme neˇz´adouc´ı data, kter´a n´am dˇr´ıve zadal uˇzivatel. Mezi neˇz´adouc´ı data ˇrad´ıme napˇr´ıklad HTML nebo v horˇs´ım pˇr´ıpadˇe javascript, kter´y napˇr´ıklad zcela zmˇen´ı vzhled a funkcionalitu str´anky. V aplikaci

(42)

7 ZABEZPE ˇCEN´I

zajiˇst’uje ochranu proti XSS escapov´an´ı speci´aln´ıch znak˚u pˇri v´ypisu.

<h:outputText value="#{taskBean.question}" />

Jedinou v´yjimku tvoˇr´ı rozhran´ı, kde uˇcitel zad´av´a specifikaci datab´aze. Tady m´a pˇrichystan´y HTML editor, v nˇemˇz nen´ı moˇzn´e mˇenit zdrojov´y k´od pˇr´ımo. Pˇr´ıpadn´e speci´aln´ı znaky tedy rovnˇeˇz budou escapov´any. Uk´azka pro v´ypis z HTML editoru.

<h:outputText value="#{solutionBean.database.specification}" escape="false" />

7.6.4 Nezabezpeˇcen´e pˇr´ım´e odkazy na objekty

Uˇzivatel se m˚uˇze napˇr´ıklad pomoc´ı URI dostat k soubor˚um, ke kter´ym by nemˇel m´ıt nikdo pˇr´ıstup. M˚uˇze to b´yt napˇr´ıklad konfigurace datab´aze. J´a m´am vˇsechny neveˇrejn´e zdroje ve sloˇzce s n´azvem WEB-INF, kter´a je pro uˇzivatele nepˇr´ıstupn´a. Tak´e zde m´am facelety, kter´e se vkl´adaj´ı do ˇsablony. To je moje osobn´ı vylepˇsen´ı n´avrhu oproti tˇem, kter´e jsem mˇel na internetu moˇznost vidˇet. Nˇekter´e URL jsou rovnˇeˇz zabezpeˇceny na z´akladˇe uˇzivatelsk´ych rol´ı. Dalˇs´ı moˇznost´ı pro ´utoˇcn´ıka je pozmˇenit parametr a z´ıskat data, kter´a mu nepatˇr´ı. J´a naˇc´ıt´am do pamˇeti pouze objekty, ke kter´ym uˇzivatel pˇr´ıstup m´a a jin´e modifikovat nelze.

Pokud by se objekt nenach´azel v pamˇeti, pak neprojde validace vstupu.

7.6.5 Nebezpeˇcn´a konfigurace

Utoˇ´ cn´ık m˚uˇze vyuˇz´ıt aktu´aln´ı pˇrednastaven´e konfigurace, kter´a b´yv´a ˇcasto nebezpeˇcn´a.

Proto jsem konfiguraci pozmˇenil. Vytvoˇril jsem tak´e vlastn´ı chybov´e str´anky a aplikace je v reˇzimu ostr´eho nasazen´ı a nevypisuje tedy pˇr´ıpadn´e chyby. Na serveru ani neexistuj´ı ˇ

z´adn´e pˇrednastaven´e ´uˇcty.

7.6.6 Zveˇrejnˇen´ı citliv´ych dat

Utoˇ´ cn´ık m˚uˇze vyuˇz´ıt pˇren´aˇsen´ych dat v ˇciteln´e textov´e podobˇe, slab´ych zastaral´ych ˇsifer apod. Na serveru jsem nastavil komunikaci v´yhradnˇe prostˇrednictv´ım protokolu HTTPS.

Heslo administr´atora je uloˇzeno pomoc´ı funkce bcrypt a komunikace s Shibbolethem prob´ıh´a rovnˇeˇz prostˇrednictv´ım HTTPS. Na nˇekter´ych formul´aˇr´ıch, kde je to vhodn´e, rovnˇeˇz zaka- zuji automatick´e doplˇnov´an´ı na z´akladˇe pˇredchoz´ıch relac´ı.

(43)

7 ZABEZPE ˇCEN´I

7.6.7 Chyby v ˇr´ızen´ı ´urovn´ı pˇr´ıstup˚u

Pˇr´ıstup k URL je ˇr´ızen na z´akladˇe uˇzivatelsk´ych rol´ı a nepovolen´y uˇzivatel si tedy nem˚uˇze zobrazit obsah, kter´y mu nen´ı urˇcen´y. Nicm´enˇe nic by mu nebr´anilo zavolat funkci na serveru. Proto kaˇzd´a funkce v Controlleru je opatˇrena anotac´ı @Secured. Ta zajist´ı spuˇstˇen´ı metody pouze uˇzivatelem se spr´avn´ym opr´avnˇen´ım. Jelikoˇz anotace funguje pro Spring Web MVC, musel jsem jej´ı chov´an´ı poupravit, aby fungovala i v kombinaci s JSF. Vyuˇzil jsem k tomu AOP.

7.6.8 CSRF

CSRF (Cross-Site Request Forgery) je metoda, pˇri n´ıˇz se snaˇz´ı ´utoˇcn´ık odeslat formul´aˇr z ciz´ıho zdroje a vyd´avat se pˇritom za autorizovan´eho uˇzivatele. Formul´aˇr z ciz´ıho zdroje v aplikaci SQL Tester odeslat zabraˇnuji. V aplikaci vyuˇz´ıv´am takˇrka v´yhradnˇe metody POST nikoli GET. Metody POST znesnadˇnuj´ı proveden´ı CSRF, ale rozhodnˇe mu ne- zabr´an´ı. K tomu slouˇz´ı token. Jedn´a se o n´ahodnˇe vygenerovanou hodnotu, kter´a se vy- generuje pˇri zobrazen´ı formul´aˇre na origin´aln´ı str´ance. Bez tohoto tokenu nelze formul´aˇr odeslat. JSF a Spring Security v aplikaci implementuj´ı CSRF ochranu pomoc´ı tokenu au- tomaticky.

7.6.9 Pouˇzit´ı zn´am´ych zraniteln´ych komponent

Pro svoji aplikaci jsem se snaˇzil vyb´ırat zn´am´e open-source projekty, kter´e maj´ı dobr´y v´yvoj a dokumentaci. Z´aroveˇn jsem vyuˇzil nejnovˇejˇs´ıch verz´ı a komponenty jsou tak aktu´aln´ı.

7.6.10 Neoˇsetˇren´e pˇresmˇerov´an´ı a pˇred´av´an´ı

Jelikoˇz ˇz´adn´e pˇresmˇerov´an´ı nevyuˇz´ıv´am, tak je aplikace proti tomuto druhu zranitelnosti chr´anˇena. Jedin´e pˇresmˇerov´an´ı m˚uˇze b´yt na chybov´e str´anky.

7.6.11 Clickjacking

Clickjacking mezi top 10 rizik podle OWASP nepatˇr´ı, ale i tak jej zm´ın´ım. Jedn´a se o tech- niku, kdy se po kliknut´ı na nˇejak´y prvek na str´ance, napˇr´ıklad tlaˇc´ıtko, provede jin´a akce neˇz oˇcek´av´ame. Tlaˇc´ıtko m˚uˇze b´yt tˇreba pˇrekryto neviditeln´ym odkazem. Spring Security zajiˇst’uje automatickou ochranu proti tomuto ´utoku.

References

Related documents

Tímto způsobem dojde ke spuštění jedné instance, což je použitelné v případě, že chceme spouštět více různých aplikací. Příkladem mohou být master-slave

Den teoretiska delen består av en redogörelse av hur klientbaserad programmering har växt fram, en beskrivning av några av de tekniker som finns för att åstadkomma

• Alla objekt av en viss klass kan användas på samma sätt–de har samma “gränssnitt”. • En definition av en viss klass kan ses som en mall för objekt av

NOTE: Java version 7 introduces a catch clause improvement known as final rethrow, which lets you declare a catch clause parameter final in order to throw only those checked exception

Instead of expecting a behavior before calling method A, the test checks if method B was actually invoked by A with the correct parameter using verify() after method

När man kompilerar växlar NetBeans automatiskt till ”Build”-utskrifter och när man kör ett program så visas i stället information för avlusning1. Build, eller att bygga,

Frånkoppling sker genom att det föregående elementet sätts att peka på nästa element och vise versa; dess- utom kontrolleras om elementet som tas bort är det första elementet –

Tabellerna innehåller observerat väntevärde för körtiden, dess variationskoefficient och konfidensintervall med konfidensgrad 95% för samtliga grafinstanser och