Professional Documents
Culture Documents
Informatika i računarstvo
Adin Bešlagić
Završni rad
Informatika i računarstvo
Završni rad
Mentor: Student:
Broj indeksa:
I-0403/18
SAŽETAK
U ovom radu opisane su osnove sigurnosne mjere koje se kao preduslovi zaštite, ali
i kao dobra praksa preduzimaju u razvoju web okruženja koristeći se REST API-em.
Navedeni su osnovni problemi s kojima se korisnici web aplikacija susreću i tehnikama koje
se koriste u prevazilaženju istih. Navedena su i objašnjena moguća mjesta napada na
elemente web aplikacija, te opisana najbolja praksa kako programeri mogu i trebaju osigurati
da privatni dio aplikacije bude zaštićen. Na temelju web aplikacije kao praktičnog dijela rada
i metoda etičnog hakovanja prikazane su ranjivosti jednog takvog sistema i objašnjeno je
kako aplikaciju zaštititi od potencijalnih rizika. Praktični dio završnog rada je web aplikacija
koja koristi sve temeljne preporuke zaštite i sigurnosti.
1. UVOD ........................................................................................................................................ 1
2. JAVA.......................................................................................................................................... 2
3. MAVEN ..................................................................................................................................... 4
4. SPRING...................................................................................................................................... 6
4.1. Spring Initializr .................................................................................................................. 6
4.2. Integrisano razvojno okruženje (IDE) ................................................................................ 8
5. REST API................................................................................................................................... 9
5.1. REST .................................................................................................................................. 9
5.2. HTTP .................................................................................................................................. 9
5.3. API ................................................................................................................................... 10
6. IZRADA REST API-a ............................................................................................................. 11
6.1. Klasa Student ................................................................................................................... 11
6.2. REST Controller............................................................................................................... 11
7. POMOĆNE BIBLIOTEKE ...................................................................................................... 15
7.1. Spring WEB ..................................................................................................................... 15
7.2. Spring DATA JPA ........................................................................................................... 16
7.3. Lombok ............................................................................................................................ 17
8. SPRING SECURITY ............................................................................................................... 18
9. AUTENTIFIKACIJA ............................................................................................................... 21
10. ULOGE I DOZVOLE .......................................................................................................... 27
11. CSRF .................................................................................................................................... 32
12. SESIJE I KOLAČIĆI ........................................................................................................... 34
12.1. O kolačićima ................................................................................................................ 36
12.2. O sesijama .................................................................................................................... 38
13. POVEZIVANJE SA BAZAMA PODATAKA .................................................................... 40
ZAKLJUČAK .................................................................................................................................. 43
LITERATURA ................................................................................................................................. 44
POPIS SKRAĆENICA .................................................................................................................... 46
PRILOZI .......................................................................................................................................... 47
1. UVOD
Cyber sigurnost je polje koje se brzo razvija i postaje sve važnije kako se naši životi
sve više oslanjaju na tehnologiju. Od zaštite osjetljivih ličnih i finansijskih informacija do
osiguravanja integriteta kritične infrastrukture, cyber sigurnost igra vitalnu ulogu u
održavanju lične sigurnosti i sigurnosti cjelokupnog društva, stoga sa sigurnošću možemo
reći da je cyber sigurnost jedno od najvažnijih pitanja današnjice.
Ovim radom u glavni fokus će biti stavljena izrada sigurne web aplikacije u Java
programskom jeziku uz pomoć „okvira za rad“ (u daljnjem tekstu kao eng. framework)
Spring i njegove biblioteke Spring Security.
1
2. JAVA
Java je popularan programski jezik koji se široko primjenjuje više od dvije decenije.
Poznat je po svojoj jednostavnosti, objektno orijentisanom dizajnu i portabilnosti, što ga čini
svestranim i široko prihvaćenim jezikom za izradu velikog broja aplikacija.
Java je statički tipiziran jezik, što znači da varijable moraju biti deklarirane sa
određenim tipom podataka prije nego što se mogu koristiti. Ovo pomaže u sprečavanju
grešaka i poboljšanju kvaliteta koda osiguravajući da se varijable koriste dosljedno u cijelom
programu.
Pored svojih osnovnih karakteristika, Java takođe ima bogat skup standardnih
biblioteka koje pružaju širok spektar funkcionalnosti, uključujući ulaz/izlaz, umrežavanje i
manipulaciju podacima. Ove biblioteke olakšavaju programerima da prave aplikacije bez
potrebe za pisanjem koda niskog nivoa.
2
Od svog prvog pojavljivanja 1995. godine Java je pretrpila nekoliko velikih izmjena
kroz verzije, gdje je svaka od njih donijela nove funkcionalnosti i unaprijeđenja, poput novih
sintaksičkih pravila, unaprijeđenih performansi, proširenja fukcionalnosti, API-a
(„Application Programming Interfaces“) i još mnogo toga. Trenutna stabilna vezija je verzija
Java 17, izašla u septembru 2021. 1
1
“Java SE, JDK 17 Documentation”, Oracle Help center, https://docs.oracle.com/en/java/javase/17/,
(pristupljeno 18.12.2022.)
3
3. MAVEN
Još jedna ključna karakteristika Mavena je njegova podrška za širok spektar faza
izgradnje, kao što su kompajliranje, testiranje, pakovanje i implementacija. Maven može
automatski pokrenuti ove faze ispravnim redoslijedom, omogućavajući programerima da
izgrade i implementiraju svoje aplikacije pomoću jedne naredbe. Ovo proces razvoja čini
efikasnijim i dosljednijim.
2
“Welcome to Maven”, Apache Maven Project, https://maven.apache.org/, (pristupljeno 19.12.2022)
4
Sve u svemu, Maven je vrlo moćan i široko korišten alat za automatizaciju izgradnje
koji može značajno pojednostaviti proces razvoja za projekte pisane u Javi. Njegova podrška
za biblioteke, faze izrade i dodatke, kao i njegova konfigurabilnost i proširivost, čine ga
osnovnim alatom za mnoge Java programere, pa će tako Maven i u ovom projektu biti glavni
alat za izgradju.
5
4. SPRING
Uz svoje osnovne karakteristike, Spring nudi niz modula koji podržavaju širok
spektar funkcionalnosti, uključujući web razvoj, pristup podacima i razmjenu poruka. Na
primjer, Spring Web MVC modul pruža framework za web aplikacija, dok Spring Data
modul pojednostavljuje proces rada sa bazama podataka. Ovi moduli se mogu koristiti
pojedinačno ili u kombinaciji za izgradnju aplikacija širokog spektra funkcionalnosti.
Spring Initializr5 je web alat koji omogućava programerima da brzo kreiraju novi
Spring Boot projekat.
3
“Dependency Injection”, Oravle Java documentation, https://docs.oracle.com/javaee/dependency-injection ,
(pristupljeno 20.12.2022)
4
Niko Schwarz, Mircea Lungu, Oscar Nierstrasz, “Seuss: Decoupling responsibilities from static methods for
fine-grained configurability”, Journal of Object Technology, Volume 11, no. 1 (April 2012), p. 2
5
Spring Initializr tool, https://start.spring.io/, (pristupljeno 20.12.2022)
6
Korištenje Spring Initializr-a je veoma jednostavno. Prvo, programeri biraju tip projekta koji
žele da kreiraju, kao što je Maven ili Gradle projekat, te biraju verziju Spring Boot-a koju
žele da koriste. Zatim mogu odabrati biblioteke koje žele uključiti u projekt, kao što su Web
MVC, JPA data, Security i druge. Spring Initializr će zatim generisati osnovnu strukturu
projekta i konfiguraciju na osnovu ovih izbora, omogućavajući programerima da odmah
počnu da rade na svojoj aplikaciji.
Spring Initializr također nudi niz naprednih opcija koje omogućavaju programerima
da detaljnije prilagode svoj projekat. Na primjer, jezik koji žele koristiti, Java, Groovy ili
Kotlin, odabrati tip pakovanja projekta koji žele koristiti, JAR ili WAR. Također je moguće
odrediti naziv i lokaciju projekta, kao i sva dodatna svojstva ili opcije konfiguracije koje se
mogu uključiti. Nakon svih postavki i podešavanja koje programer može izvršiti na ovoj
stranici i odluči generisati svoj Spring boot projekat, pokreće preuzimanje demo.zip
dokumenta koji će sadržavati „hello world“ (hello world je naziv za početni projekat koji još
nema nikakvu specifičnu funkcionalnost osim da programeru da do znanja da je program
pokrenut i uspješno izvršen. Obično izvršava ispis “Hello World” u konzoli.) projekat sa
traženom konfiguracijom.Ovaj projekat se otvara u nekom od razvojnih okruženja (IDE), a
u izradi ovog projekta korišten je JetBrains-ov IntelliJ IDEA6.
6
IntelliJ IDEA, Java and Kotlin IDE, https://www.jetbrains.com/idea/, (pristupljeno 12.12.2022)
7
4.2. Integrisano razvojno okruženje (IDE)
Slika 2. Struktura projekta generisanog pomoću Spring Initializr web alata prikazana u IntelliJ IDEA
razvojnom okruženju (izvor: autor rada)
8
5. REST API
5.1. REST
5.2. HTTP
HTTP je stateless protokol, što znači da je svaki zahtjev neovisan o bilo kojem
drugom zahtjevu i što je vrlo bitno u razvoju aplikacije čiji će se razvoj pratiti kroz ovaj rad.
Ovo omogućava skalabilnost i fleksibilnost, jer održavanje veze ili stanja između zahtjeva
nije potrebno.
REST uslugama se obično pristupa pomoću HTTP zahtjeva, pri čemu klijent šalje
zahtjev serveru, a server vraća odgovor. Odgovor može sadržavati podatke u više različitih
formata, kao što su XML, JSON ili HTML, ovisno o potrebama klijenta.
7
“What is REST”, Restful API, https://restfulapi.net/, (pristupljeno 21.2.2023)
8
“What is HTTP”, Cloudflare, https://www.cloudflare.com/learning/ddos/glossary/hypertext-transfer-
protocol-http/, (pristupljeno 21.2.2023)
9
5.3. API
Postoji niz prednosti korištenja API-a za izgradnju aplikacija. Prva je da API-i mogu
olakšati programerima pristup i korištenje podataka i funkcionalnosti iz drugih sistema i
servisa. Ovo može uštedjeti vrijeme i trud eliminirajući potrebu za izradom prilagođenih
rješenja integracije. Drugo, API-i mogu pomoći u promoviranju interoperabilnosti između
različitih sistema i servisa, što im olakšava zajednički rad. Na poslijetku, API-i potpomažu
inovativnost tako što će programerima olakšati izgradnju novih aplikacija i servisa koje
koriste postojeće podatke i funkcionalnost.
9
“What is an API?”, IBM, https://www.ibm.com/topics/api, (pristupljeno 21.02.2023)
10
6. IZRADA REST API-a
Po otvaranju projekta koji je preuzet sa stranice Spring Initializr započinje prvi korak
razvoja ovog projekta. Ovaj REST API će služiti za dohvatanje podataka o studentima iz
baze podataka. Za početak je u osnovnom paketu kreiran novi paket sa nazivom „student“.
U ovoj paketu će se nalaziti dvije Java klase koje će biti korištene za definisanje objekta
studenta i REST kontrolera.
Klasa Student će biti korištena za opisivanje zapisa u bazi podataka. Kako bi fokus
ostao na sigurnosti i Spring Security-u, ova klasa će biti vrlo jednostavna te će sadržati samo
dva polja i to „studentId“ kao jedinstveni identifikator i „studentName“ kao polje sa nekim
korisnim podatkom.
11
metode. Kada se @RestController anotacija koristi na kontroleru, Spring Boot automatski
konfigurira Jackson Object Mapper koji konvertira objekte u JSON formatu. To znači da se
podaci automatski serijaliziraju u JSON formatu i šalju kao odgovor na HTTP zahtjev.
Unutar ovog REST kontrolera se definišu sve metode koje će biti izložene na ovom REST
API-u. Za izradu ovog projekta neće biti bitne sve operacije nad podacima u bazi podataka,
te će se stoga napraviti jedna metoda za dohvatanje podataka iz baze i to na način da će se
dohvatiti pojedinačan zapis prema jedinstvenom identifikatoru iz putanje – „studentId“.
Putanju do ove metode na API-u postavljamo pomoću anotacije @GetMapping koja kao
argument ima nastavak na prethodno postavljenu putanju do API-a.
Slika 5. Metoda za dohvatanje pojedinačnog zapisa iz baze podataka na osnovu jedinstvenog identifikatora
proslijeđenog u putanji (izvor: autor rada)
12
Prije nego pokrenemo aplikaciju potrebo je instancirati listu studenata kako bi
korištenjem ovog REST API-a zaista mogli vidjeti njegovu funkcionalnost. Ova lista će nam
trenutno zamijeniti zapise iz baze podataka u kojoj bi bili spremljeni studenti.
Već samo sa ovim postavkama, REST API postaje dostupan na Tomcat serveru na
kojem se pokretanjem aplikacije kroz razvojno okruženje podiže instanca ove Spring Boot
aplikacije, a pristup istoj se vrši kroz pretraživač na adresi: „localhost:8080“ ili pomoću alata
za testiranje API-a poput Postman-a.
Slika 7. Poziv REST API-a za pristup zapisu iz baze podataka za element sa jedinstvenim identifikatorom 1
(izvor: autor rada)
13
Slika 8. HTTP GET zahtjev u Postman program (izvor: autor rada)
14
7. POMOĆNE BIBLIOTEKE
Spring Web je modul Spring framework-a koji pruža veliki broj komponenta za
pravljenje web aplikacija u Javi. Izgrađen je na osnovu Spring jezgra i pruža niz mogućnosti
za izgradnju web aplikacija, uključujući podršku za izgradnju web kontrolera, resolvera
prikaza i validacije.
Uz svoje osnovne karakteristike, Spring Web takođe pruža podršku za validaciju, koja
omogućava programerima da definišu ograničenja za podatke koje prihvata njihova web
aplikacija. Ovo može pomoći osiguravanju da aplikacija prima ispravne podatke i može
pomoći u sprječavanju grešaka i sigurnosnih propusta. Spring Web je kao dependency
uključen pri izradi ovog projekta u Spring Initializr-u te se već nalazi u pom.xml dokumentu.
15
7.2. Spring DATA JPA
Spring Data JPA10 je modul Spring framework-a koji pruža podršku za izgradnju
Java aplikacija koje koriste Java Persistence API (JPA) 11 za pristup podacima pohranjenim
u bazi podataka. JPA je standard za pristup i manipulaciju podacima pohranjenim u bazi
podataka, a Spring Data JPA olakšava programerima da izgrade aplikacije koje koriste JPA
pružajući niz funkcija i komponenti.
Spring Data JPA takođe pruža podršku za upite koristeći Java Persistence Query
Language (JPQL). JPQL je jezik sličan SQL-u koji omogućava programerima da definiraju
upite koristeći Java sintaksu. Spring Data JPA pruža mnoštvo različitih načina za definiranje
JPQL upita, uključujući korištenje naziva metoda i anotacije.
Pored svojih osnovnih karakteristika, Spring Data JPA takođe pruža podršku za
brojne dodatne funkcionalnosti, kao što su paginacija i auditing. Ove funkcije mogu olakšati
programerima da naprave robusnije i bogatije aplikacije koje trebaju pristupiti podacima
pohranjenim u bazi podataka i manipulirati njima.
10
“Spring Data JPA”, Spring, https://spring.io/projects/spring-data-jpa, (pristupljeno 20.12.2022)
11
“Introduction to the Java Persistence API”, Java EE 6 Tutorial,
https://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html, (pristupljeno 20.12.2022)
16
7.3. Lombok
Projekat Lombok 12je Java biblioteka koja pruža skup anotacija i alata za smanjenje
boilerplate koda u Java programima. Boilerplate kod je onaj koji se ponavlja i često nije
složen ali je neophodan za dati zadatak, kao što je postavljanje struktura podataka ili
upravljanje greškama. Lombok ima za cilj da smanji količinu boilerplate koda koji
programeri moraju da napišu pružanjem skupa anotacija koje automatski generišu ovaj kod.
12
Project Lombok, https://projectlombok.org/, (pristupljeno 22.012.2022)
17
8. SPRING SECURITY
Spring Security je okvir za osiguranje Spring i Spring boot aplikacija. Pruža niz
funkcija i komponenti za izgradnju sigurnih aplikacija, uključujući podršku za
autentifikaciju, autorizaciju i enkripciju.
Spring Security takođe pruža podršku za autorizaciju, što je proces odobravanja ili
odbijanja pristupa resursima na osnovu identiteta korisnika ili sistema. Spring Security pruža
niz različitih mehanizama za definiranje i primjenu pravila kontrole pristupa, uključujući
korištenje napomena, XML konfiguraciju i Java konfiguraciju.
18
koristiti default-no korisničko ime „user“, a lozinku je moguće vidjeti u konzoli u kojoj je
pokrenuta sam projekat.
Slika 13. Test HTTP GET zahtjeva bez unijetih kredencijala (izvor: autor rada)
19
Testom slanja istog poziva iz Postman-a, na slici 13 vidimo da je vraćeni status za traženim
resursima 401: Unauthorized. Tek kada se unesu generisani kredencijali, pristup se odobrava
i podaci budu dohvaćeni kroz HTTP GET zahtjev, u pretraživaču imamo rezultat kakav smo
imali i prije postavljanja Sprig Security-a, a i u Postman-u vidimo resurs vraćen u JSON
formatu.
Kako se može vidjeti, već i bez podešavanja Spring Security pruža osnovnu
funkcionalnost autentifikacije za aplikaciju na kojoj je dodan. U nastavku prolazimo kroz
dodatne postavke autentifikacije pomoću Spring Security.
20
9. AUTENTIFIKACIJA
• Korisničko ime i lozinka: ovo je najčešći način autentifikacije, korisnik unosi svoje
korisničko ime i lozinku, te ih aplikacija provjerava sa onima koji su pohranjeni u
bazi podataka
• Token-based: ovaj način autentifikacije koristi se kada se korisnik autentificira
jednom, a aplikacija mu daje token koji se koristi za svaki naredni zahtjev. Token
se provjerava na svakom zahtjevu kako bi se utvrdilo da li korisnik ima pravo
pristupa zaštićenim dijelovima aplikacije.
• Biometrija: ovaj način autentifikacije koristi se kada se koriste senzori za
skeniranje biometričkih podataka korisnika, poput otisaka prstiju, prepoznavanja
lica ili glasa.
• Certifikati: ovaj način autentifikacije se koristi kada se koriste digitalni certifikati
za potvrdu identiteta korisnika.
Kao prvi korak u dodavanju autentifikacije koju ćemo konfiurisati u ovaj projekat
dodajemo tzv. „Basic Auth“ autentifikaciju. Na slici 15 možemo vidjeti dijagram
cijelog procesa, a u nastavku slijedi objašnjenje.
Slika 15. Dijagram toka Basic Auth procesa (izvor: autor rada)
21
Basic Auth je jedan od najčešćih mehanizama autentifikacije koji se koristi za
osiguravanje pristupa web servisima. Ovaj mehanizam koristi kombinaciju korisničkog
imena i lozinke za način provjere identiteta korisnika.
Sada kad je jasan slijed koraka i procedura koje se moraju izvršiti da bi se postigao bazični
nivo autentifikacije, može se krenuti na implementaciju iste unutar ovog projekta. Potrebno
je napraviti novi paket u kojem će se nalaziti klase za konfiguraciju autentifikacije. U ovom
slučaju taj paket će biti nazvan „security“. Prva klasa koja će biti dodana je klasa
ApplicationSecurityConfig. Ova klasa će zapravo predstavljati Web Security Confiurer
Adapter, praktično konfiguraciju Web Security-a korz Spring Security.
22
Ova klasa će imati dvije anotacije. @Configuration anotacija se koristi u Spring-u za
označavanje klasa koja sadrži metode za konfigurisanje elemenata aplikacije. Ova anotacija
označava da se klasa koristi za definisanje bean-ova (Spring Java objekata instanciranih u
runtime-u aplikacije), pa će i ovdje označavati da se radi o konfiguracijskoj klasi.
@EnableWebSecurity anotacija omogućava uključivanje sigurnosti web aplikacije. Ovu
anotaciju u kombinaciji sa @Configuration anotacijom koristimo za aktiviranje
podrazumijevanog sigurnosnog konfiguracijskog okvira za web aplikacije koji se temelji na
Spring Security biblioteci. Spring Framework će na osnovu anotacija u ovoj klasi automatski
konfigurisati sigurnosne postavke za aplikaciju, kao što su autentifikacija i autorizacija
korisnika, zaštita od napada (CSRF, XSS) itd. Kako bi postigli osnovu BasicAuth
autentifikacije, dovoljno je da unutar konfiguracijske klase napravimo “override” metode
configure. Za proslijeđeni http zahtjev, ova metoda osigurava da se za svaki autorizirani
zahtjev traži autentifikacija od korisnika koisteći BasicAuth metodu autentifikacije.
Nakon ove izmjene, za pristup bilo kojem end point-u API-a neophodna će biti
autentifikacija pomoću korisničkog imena “user” i generisane lozinke.
Međutim, to nije očekivano ponašanje jedne web aplikacije. Ono što korisnik očekuje
je da u aplikaciju može ući upisivanjem svojih proizvoljno definisanih kredencijala, koji bi
bili spremljeni u neku bazu, a aplikacija bi pri njegovoj akciji login-a trebala provjeriti da li
uneseni par kredencijala odgovara onome iz baze.
23
InMemoryUserDetailsManager. Ovaj menadžer nam dopušta da na jednostavan način,
korištenjem builder pattern-a, kreiramo i dalje upravljamo korisnicima čiji će podaci biti
spremljeni u radnu memoriju aplikacije.
Slika 18. Metoda userDetailsService i provizionirani korisnik “admin” (izvor: autor rada)
Kao što je već i rečeno, lozinka radi zaštite mora biti enkodirana, pa će nas Spring
pri loginu ovog korisnika upozoriti na to da lozinka nije zaštićena, te se korisnik sa
nezaštićenim kredencijalima neće moći logovati i pristupiti aplikaciji.
Slika 19. Upozorenje za lozinku koja nije enkodirana (izvor: autor rada)
24
BCript13. Kako ćemo koristiti već gotov enkoder, potrebno je napraviti klasu. Ova klasa će
da služi kao konfiguracija za enkoder, te će instanciranjem vraćati PasswordEncoder kao
bean.
13
“Class BCryptPasswordEncoder”, Spring Docs, https://docs.spring.io/spring-
security/site/docs/current/api/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoder.html,
pristupljeno (06.01.2023)
25
Slika 21. Kod za Autowire-ing dependency-a (izvor: autor rada)
26
10. ULOGE I DOZVOLE
27
Za potrebe ove aplikacije, uloge i dozvole ćemo navesti u po jednoj java enum klasi.
Uz enum klase kreirat ćemo i konstruktor i getter koristeći Lombok.
Pri prvom testu ćemo Admin korisnicima dati sve dozvole, dok studenti neće imati
dozvolu za bilo šta. Nakon što su u ovim enum klasama definisane uloge i dozvole, možemo
kreirati korisnike sa predefinisanim ulogama.
U ovom trenutku oba korisnika i dalje mogu pristupati svim resursima koje ovaj API
nudi. Kako bi ograničili pristup, koristit ćemo AntMatcher-e. Unutar configure() metode
28
ćemo ubaciti AntMatchere koji će dozvoliti korištenje API-a samo Admin korisnicima i to
na način prikazan na slici 26. U suprotnom, korisnik će dobiti status kod 403 sa porukom
„Forbidden“ što će značiti da taj korisnik nema dozvole za korištenje tog resursa.
Slika 26. Ant Matcher za ograničavanje pristupa API-u samo za ADMIN korisnike (izvor: autor rada)
Sada možemo kreirati i početnu stranicu index.html našeg API-a. Na njoj će biti
naslov API-a i dugme koje će voditi na poziv “/api/students/all”. Uz nju će biti kreiran i
odgovarajući styles.css.
Kada imamo početnu stranicu, želimo dopustiti svima da je vide, ali samo onima koji
su autentifikovani i imaju dozvolu da koriste resurse. To ćemo uraditi dodavanjem još jednog
Ant Matcher-a (slika 28). U Ant Matcher ćemo dodati “index.html“ i „/css/*“ te ćemo
odabrati opciju permitAll() što će značiti da su index.html i svi resursi iz foldera css dostupni
svima koji pristupaju našem API-u.
29
Slika 28. Ant Matcher za dozvolu pristupa početnoj stranici svim korisnicima (izvor: autor rada)
Dokazali smo da Spring Security može da bez problema ograniči pristup našem API-u de ta
upravlja dozvolama i korisnicima. Sada ćemo pristup resursima na putanji /api/** dozvoliti
samo studentima na način da ćemo umjesto hasRole(ADMIN.name()) u Ant Matcher ubaciti
hasRole(STUDENT.name()).
Slika 29. Prikaz funkcionalnosti u administracijskom API kontroleru (izvor: autor rada)
30
Time uklanjamo dozvole za admin korisnike za ovaj dio API-a. To je upravo ono što
želimo iz razloga što ćemo za administraciju napraviti novi API koji će davati nešto više
funkcionalnosti pored samog čitanja podataka.
Slika 30. Početna stranica sa novim dugmetom za pristum menadžmet API-u (izvor: autor rada)
31
11. CSRF
Cross-Site Request Forgery (CSRF) je vrsta ranjivosti web aplikacije koja napadaču
omogućuje izvršavanje neželjenih radnji na web stranici ili web aplikaciji u ime
autentificiranog korisnika. „To je napad koji navede korisnički uređaj da izvršava neželjene
akcije na web aplikaciji na kojoj je korisnik trenutno autentificiran.“14 Napad funkcionira
tako da prevari korisnikov pretraživač da pošalje zahtjev ciljanoj web stranici ili aplikaciji,
koristeći korisničke kredencijale i druge autentifikatore, bez znanja ili pristanka korisnika.
CSRF napadi mogu se spriječiti korištenjem mjera kao što je dodavanje CSRF tokena
svakom obrascu, osiguravanje da se zahtjevi prihvaćaju samo od autentificiranih korisnika i
implementacija drugih sigurnosnih mjera za sprječavanje neovlaštenog pristupa.
Spring pruža već out-of-the-box CSRF zaštitu. Prema zadanim postavkama, Spring
generiše jedinstveni token za svaku sesiju i uključuje ga u HTML obrazac kao skriveno polje.
Kada korisnik podnese obrazac, token je uključen u zahtjev, a Spring ga uspoređuje s
tokenom povezanim s korisnikovom sesijom kako bi osigurao da je zahtjev legitiman.
Sada ćemo vidjeti šta to u praksi znači. Kada se korisnik uspješno logira po prvi put,
kreira se njegov XSRF Token sa kojim će moći da poziva PUT, POST i DELETE metode
REST API-a. Token će biti potreban za navedene operacije, te neophodno ga je spremiti
kako bi se u budućnosti mogao koristiti u header-u zahtjeva. Za čuvanje tokena i jednostavno
korištenje iskoristit ćemo klasu CsrfTokenRepository iz Spring Security biblioteke. Tu su
14
KristenS., “Cross Site Request Forgery (CSRF)”, OWASP, https://owasp.org/www-community/attacks/csrf,
pristupljeno (21.2.2023.)
32
definisane metode kojima će se generisani token spremati za daljnje korištenje i kada bude
potrebe dodati u header-e zahtjeva koji se šalju.
Za dodavanje ove klase potrebno je samo dodati jednu liniju koda unutar
AppllicationSecurityConfig klase u metodi configure. Na slici 31. je prikazana metoda
nakon dodavanja CsrfTokenRepository-a.
Slika 31. Metoda configure sa dodanim postavkama za CSRF zaštitu (izvor: autor rada)
Sa time bi završili sva potrebna podešavanja za zaštitu od CSRF napada. Međutim, kako ovo
nije aplikacija koju ćemo hostati na internet, prema Spring Security dokumentaciji za CSRF,
uključivanje zaštite od CSRF napada nije potrebno te ćemo ovu liniju jednostavno zamijeniti
sa „.csrf().disable()“ te na taj način isključiti nepotrebnu zaštitu za našu aplikaciju dok je ista
u offline režimu rada.
33
12. SESIJE I KOLAČIĆI
Slika 32. Dijagram toka Form Login metode autentifikacije (izvor: autor rada)
Spring Security nam i za form Login već nudi gotov paket koji možeko koristiti.
Kada je metoda configure podešena kao na slici 33., pri pokretanju aplikacije vidimo
slijedeći ekran (slika 34.).
34
Slika 33. configure metoda sa podešenom formLogin autentifikacijom (izvor: autor rada)
35
12.1. O kolačićima
Slika 36. Konfiguracija za korisnički definisanu login stranicu (izvor: autor rada)
Trenutno, zahtjev mapiran na endpointu /login ne radi ništa jer za njega još uvijek nemamo
kontroler. Naredni korak će nam biti onda napraviti kontroler koji će biti dostupan svima i
koji će otvarati login stranicu. Budući da ćemo koristiti Thymeleaf, u novom paketu
„controller“ pravimo novi kontroler pod nazivom TemplateController. Unutar tog kontrolera
ćemo odmah napraviti dva endpoint-a, jedan za login, a drugi za stranicu kurseva koja će
biti otvorena po uspješnom loginu.
36
Slika 37. Klasa TemplateController (izvor: autor rada)
Kako bi nakon uspješnog login-a bili preusmjereni na stranicu „courses“, u configure metodi
ćemo dodati još jednu opciju a to je defaultSuccessUrl.
Sada možemo kreirati naše korisnički definisane login i courses stranice. Za potrebe ovog
primjera, to će biti dvije vrlo jednostavne stranice, a njihov izgled se može vidjeti na slikama
39 i 40.
37
Slika 40. Izgled courses stranice (izvor: autor rada)
12.2. O sesijama
Nakon što se korisnik loguje, dobije svoj SESSIONID koji vrijedi 30 minuta prema
unaprijed definisanoj vrijednosti. To znači da će se korisnik nakon 30 minuta neaktivnosti
morati ponovo ulogovati u aplikaciju. Naravno, u nekim slučajevima to nije nešto što želimo,
te bi rješenje ovoga bilo da se korisniku ponudi opcija „Zapamti me“ što će njegovu sesiju
po predefinisanoj vrijedosti produžiti sa 30 minuta na dvije sedmice. Ovo će praktično reći
Spring Security-u da napravi novi kolačić koji će sadržati hash trenutnog SESSIONID-a i
maksimalno vrijeme trajaja tog SESSIONID-a.
38
Slika 41. Postavljanje rememberMe opcije unutar configure metode (izvor: autor rada)
Slika 42. Postavljanje logout opcije u configure metodi (izvor: autor rada)
Sada imamo stranicu koja radi osnovni login/logout i upravlja dužinom trajanja korisničkih
sesija.
39
13. POVEZIVANJE SA BAZAMA PODATAKA
Već smo na nekoliko mjesta spominjali baze podataka i njihov značaj. Do sada smo
napravili dva korisnika pomoću userDetailsService-a i InMemoryUserDetailsManager-a.
Sada ćemo u projekat dodati interface koji ćemo moći koristiti ako bi nekada željeli ove
korisnike spremiti u bazu podataka.
Prije svega, moramo napraviti klasu korisnika. U novom paketu “auth” pravimo
klasu ApplicationUser koja će implementirati već korišteni interface Spring Security-a za
korisnike UserDetails.
Pored modela koji smo upravo napravili, bit će nam potreban i servis koji ćemo
koristiti za komunikaciju sa bazom podataka. U istom paketu pravimo još jednu klasu koja
će se u ovom slučaju zvati ApplicationUserService i koja će implementirati
UserDetailsService. Prije nego što uradimo Override metode iz interface-a
UserDetailsService, napravit ćemo i samo svoj interface. Ovaj interface će imati naziv
ApplicationUserDao i u sebi će imati jednu metodu koja će vraćati Optional
ApplicationUser-a prema korisničkom imenu koje se proslijedi.
40
Slika 44. Interface ApplicationUserDao (izvor: autor rada)
41
Sa svim ovim klasama napravljenim, sada možemo izmijeniti klasu
ApplicationSecurityConfig tako da se unutar nje više ne spremaju korisnici. Kako bi
omogućili komunikaciju sa repozitorijem, potrebno je da napravimo
DaoAuthenticationProvider. Ovaj metod će ustvari instancirati Bean providera kojeg ćemo
dalje korsititi kao interface prema bazi.
Nakon ovih koraka, aplikacija bi trebala da radi kao i do sada, samo što će korisničkim
podacima pristupati koristeći RepoApplicationUserDaoService. Implementacijom ovakvog
jednog interface-a u novoj klasi za povezivanje sa bilo kojom bazom podataka smo praktično
omogućili da naša aplikacija konzumira podatke iz bilo koje druge odabrane baze podataka
bez obzira na tip čime se postiže veliki stepen modularnosti i kompatibilnosti.
Na samom kraju kada se instancira i baza podataka koja se može uvezati pomoću
jednostavnog interface-a, imamo aplikaciju koja nudi dva odvojena REST API-a, upravlja
ulogama korisnika i dozvolama koje su vezane za njihove uloge, vodi brigu o korisničkim
sesijama, implementira „form based“ metodu autentifikacije korisnika, a sve pomoću Spring
Boot framework-a i Spring Security biblioteke.
42
ZAKLJUČAK
Cilj nam je bio naglasiti važnost odabira odgovarajućih razvojnih alata i tehnologija
koji mogu pojednostaviti razvojni proces i pružiti potrebnu funkcionalnost sa jako malo
truda i osnovnim znanjem. Nadalje, implementacija sigurnosnih mjera, kao što su
autentifikacija i autorizacija, ključne su za osiguranje sigurnosti korisničkih podataka i
sprječavanje neovlaštenog pristupa.
43
LITERATURA
Elektronski izvori:
Knjige:
1. Head First Design Patterns: A Brain-Friendly Guide 1st Edition, Eric Freeman & Elisabeth
Robson, 2004
44
2. Niko Schwarz, Mircea Lungu, Oscar Nierstrasz, “Seuss: Decoupling responsibilities from
static methods for fine-grained configurability”, Journal of Object Technology, Volume 11,
no. 1 (April 2012)
3. Spring Boot in Action, Craig Walls, 2015
4. Spring Boot: Up & Running, Mark Heckler, O’Reilly 2021
45
POPIS SKRAĆENICA
MVC Model-View-Controller
46
PRILOZI
47