WEB Programiranje - fsb.unizg.hr · PDF file6 Prva domaca zada´ ca´ Slijedeci...

29
WEB Programiranje - seminarski rad - Jakov Topi ´ c

Transcript of WEB Programiranje - fsb.unizg.hr · PDF file6 Prva domaca zada´ ca´ Slijedeci...

WEB Programiranje- seminarski rad -

Jakov Topic

Sadržaj

1 Prva domaca zadaca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.1 Website layout-ovi 5

1.2 HTML <div> element 51.2.1 HTML <div> unutar <div> elementa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.3 HTML Layout - koristeci <div> elemente 8

1.4 HTML Layout - koristeci tablice 9

1.5 Višestupcani Layout - koristeci tablice 10

1.6 HTML Iframe-ovi 111.6.1 Iframe-postavke visine i širine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.6.2 Iframe - Uklanjanje okvira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.6.3 Korištenje iframe-a kao metu za link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2 Prvi seminarski rad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.1 Kontrola Pristupa 15

2.2 Autentifikacija 172.2.1 Ogranicenja kod registracije . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.2.2 CAPTCHA i reCAPTCHA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.2.3 Prilagodba Auth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.2.4 Preimenovanje Auth tablica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.3 Autorizacija 24

2.4 Središnja Autentifikacijska Služba 26

Website layout-oviHTML <div> element

HTML <div> unutar <div> elementaHTML Layout - koristeci <div> elementeHTML Layout - koristeci tabliceVišestupcani Layout - koristeci tabliceHTML Iframe-ovi

Iframe-postavke visine i širineIframe - Uklanjanje okviraKorištenje iframe-a kao metu za link

1 — Prva domaca zadaca

1.1 Website layout-ovi

Layout stranice je proces postavljanja, uredenja i preuredenja teksta (kompozicija tek-sta) te grafike na stranici za izradu dokumenata kao što su novine, brošure,knjige, itd. Izgled("layout") stranice nekog tiskanog ili elektronskog dokumenta obuhvaca sve elemente te stranice.To ukljucuje margine, tekst blokove, slike, i bilo koje rešetke ("grids") ili predloške ("templates")koji se koriste za definiranje pozicije objekata na stranici.

Vecina website-ova stavlja svoj sadržaj u višestruke stupce formatirane kao casopis ili no-vine. Svaki standardni layout sastoji se od banner-a pri vrhu stranice, navigacije te sadržaja("content") ili prikaznog okvira ("display box"). To su temelji bilo koje web stranice.

Za web dizajn, dizajneri koriste softver posebno za stvaranje web stranica ili softver za kreiranjelayout-a stranice koji ih može pretvoriti u odgovarajuci format za online korištenje. Višestrukistupci mogu se napraviti korištenjem <div> ili <table> elementa, a CSS nam zatim omogucujeda pozicioniramo elemente, da kreiramo pozadine stranice, raznobojni izgled stranice te mnogedruge stvari.

Iako je moguce napraviti lijepe layout-ove s HTML tablicama, tablice su prvenstveno biledizajnirane za predstavljanje tablicnih podataka - a NE kao alat za izradu layout-ova!

1.2 HTML <div> element

<div> tag nije ništa više od kontejnerske jedinice koja oblaže druge elemente stranicei dijeli HTML dokument u sekcije. Web programeri koriste <div> element kako bi grupiralizajedno HTML elemente i primijenili CSS stilove na mnoge elemente odjednom.

Na primjer, umatanjem skupa paragrafa elemenata u <div> element , programer može iskoristitiprednost CSS stilova i promijeniti font svim paragrafima od jednom primjenom stila fonta na<div> tag umjesto kodiranja istog stila za svaki paragraf posebno.

6 Prva domaca zadaca

Slijedeci kôd prikazuje kako kreirati najjednostavniji <div> element koji u sebi sadrži jedanpodnaslov i dva paragrafa:

Program 1.1 HTML div element kôd

1 < !DOCTYPE html >2 <html >3 <body>4 < d i v i d =" myDiv " name=" myDiv " t i t l e =" Example Div Element ">5 <h5> Podnas lov < / h5>6 <p> Ovaj p a r a g r a f ce b i t i vas p a r a g r a f s a d r z a j a . . . < / p>7 <p> Evo j o s j ed no g s a d r z a j a c l a n k a o v d j e . < / p>8 < / d i v >9 < / body>

10 < / h tml >

S tim tekstualnim elementima sada grupiranim zajedno pod <div> elementom, možemopromijeniti izgled svakog osnovnog elementa zajedno primjenom "style" atributa na <div> tag.

Program 1.2 HTML div element sa CSS stilom

1 < !DOCTYPE html >2 <html >3 <body>4 < d i v i d =" myDiv " name=" myDiv " t i t l e =" Example Div Element "5 s t y l e =" background−c o l o r : #F0F8FF ; c o l o r : #0900C4 ; f o n t :6 H e l v e t i c a 12 p t ; b o r d e r : 1px s o l i d b l a c k ; ">7 <h5> Podnas lov < / h5>8 <p> Ovaj p a r a g r a f ce b i t i vas p a r a g r a f s a d r z a j a . . . < / p>9 <p> Evo j o s j ed no g s a d r z a j a c l a n k a o v d j e . < / p>

10 < / d i v >11 < / body>12 < / h tml >

Elementi smješteni unutar <div> tag-a stjecu sve stilove ili svojstva primijenjene na glavni<div> element. Dakle sada ce paragrafi i naslovni elementi biti u "Helvetica" font-u i obojani uplavu boju, a pozadina ce biti takoder u boji koja je definirana njezinim heksadecimalnim brojem,što prikazuje slijedeca slika:

1.2 HTML <div> element 7

1.2.1 HTML <div> unutar <div> elementa

Stavljanje <div> elemenata unutar drugih <div> elemenata omogucuje tim elementimada se dalje podijele, što prikazuje slijedeci kôd:

Program 1.3 HTML div potpodjela

1 < !DOCTYPE html >2 <html >3 <body>4 < d i v i d =" myDiv " name=" myDiv " t i t l e =" Example Div Element "5 s t y l e =" background−c o l o r : # F0F8FF ; f o n t−f a m i l y : H e l v e t i c a ;6 f o n t−s i z e : 12 p t ; b o r d e r : 1px s o l i d b l a c k ; ">7 < d i v i d =" subDiv1 " name=" subDiv1 " t i t l e =" S u b d i v i s i o n Div

Element "8 s t y l e =" c o l o r : #FF0000 ; b o r d e r : 1px d o t t e d b l a c k ; ">9 <h5> S e c t i o n 1< / h5>

10 <p> Ovaj p a r a g r a f ce b i t i vas p a r a g r a f s a d r z a j a . . . < / p>11 <p> Evo j o s j ed no g s a d r z a j a c l a n k a o v d j e . < / p>12 < / d i v >13 < br / >14 < d i v i d =" subDiv2 " name=" subDiv2 " t i t l e =" S u b d i v i s i o n Div

Element "15 s t y l e =" c o l o r : #FF00FF ; b o r d e r : 1px dashed b l a c k ; ">16 <h5> S e c t i o n 2< / h5>17 <p> Ovaj p a r a g r a f ce b i t i vas p a r a g r a f s a d r z a j a . . . < / p>18 <p> Evo j o s j ed no g s a d r z a j a c l a n k a o v d j e . < / p>19 < / d i v >20 < / d i v >21 < / body>

Kao što vidimo iz slike ispod, glavni <div> element koji je nazvan "myDiv" sadrži u sebi dvapod-<div> elementa i u njemu definiran stil je odredio boju pozadine samo zato što u pod-<div>elementima boja pozadine nije bila definirana.

8 Prva domaca zadaca

1.3 HTML Layout - koristeci <div> elemente

Div element je element na razini bloka te se koristi za grupiranje HTML elemenata.Slijedeci primjer prikazuje layout koji je napravljen od pet div elemenata.

Na prvom div elementu smo pomocu stila odredili ukupnu širinu layout-a koja iznosi 500piksela. Zatim slijedi div element koji reprezentira glavni naslov stranice i njemu je pridodanid="header", njegova visina odredena je prostorom koji zauzima naslov <h1>.

S lijeve strane ispod naslova nalazi se glavni izbornik, definiran div elementom koji je visok200 piksela i širok 125 piksela, te smo njemu pridodali <a> elemente koji sluze kao navigacijskilinkovi.

Desno od izbornika postavljen je cetvrti div element koji predstavlja sadržaj i on zauzimaprostor od 375x200 piksela. Zadnji div element jest podnožje ("footer") koji je takoder glavnidio osnovnog layout-a.

Program 1.4 HTML layout sa <div> elementima

1 < !DOCTYPE html >2 <html >3 <body>4 < d i v i d =" c o n t a i n e r " s t y l e =" wid th :500 px ">5 < d i v i d =" h e a d e r " s t y l e =" background−c o l o r : rgb ( 1 0 0 , 2 0 0 , 2 5 5 ) ; ">6 <h1 s t y l e =" margin−bot tom : 0 ; "> Gl av n i Nas lov Web S t r a n i c e < / h1>< /

d i v >7 < d i v i d =" menu " s t y l e =" background−c o l o r : l i g h t b l u e ; h e i g h t : 200 px ;8 wid th :125 px ; f l o a t : l e f t ; ">9 <b> I z b o r n i k ( Menu ) < / b>< br >

10 <a h r e f =" h t t p : / / www. w3schoo l s . com">HTML< / a>< br >11 <a h r e f =" h t t p : / / www. w3schoo l s . com">CSS< / a>< br >12 <a h r e f =" h t t p : / / www. w3schoo l s . com"> J a v a S c r i p t < / a>< br >13 <a h r e f =" h t t p : / / www. w3schoo l s . com">JQuery< / a>< br >14 <a h r e f =" h t t p : / / www. w3schoo l s . com">XML< / a>15 < / d i v >16 < d i v i d =" c o n t e n t " s t y l e =" background−c o l o r : aqua ; h e i g h t : 200 px ;17 wid th :375 px ; f l o a t : l e f t ; ">18 Sadr \ v{ z } a j i d e o v d j e < / d i v >19 < d i v i d =" f o o t e r " s t y l e =" background−c o l o r : rgb ( 1 0 0 , 2 0 0 , 2 5 5 ) ;20 c l e a r : bo th ; t e x t −a l i g n : c e n t e r ; ">21 C o p y r i g h t Âc© W3Schools . com< / d i v >22 < / d i v >23 < / body>24 < / h tml >

HTML kod prikazan iznad ce proizvesti slijedeci rezultat:

1.4 HTML Layout - koristeci tablice 9

1.4 HTML Layout - koristeci tablice

Jednostavan nacin za stvaranja layout-a je pomocu HTML <table> tag-a (oznake).Sljedeci primjer koristi tablicu s tri reda i 2 stupca - prvi i zadnji red obuhvaca oba stupca pomocu"colspan" atributa:

Program 1.5 HTML layout sa <table> elementima

1 < !DOCTYPE html >2 <html >3 <body>4 < t a b l e wid th =" 500 " b o r d e r =" 0 ">5 < t r >< t d c o l s p a n =" 2 " s t y l e =" background−c o l o r : rgb ( 1 0 0 , 2 0 0 , 2 5 5 ) ; ">6 <h1> G la vn i Nas lov Web S t r a n i c e < / h1>7 < / t d >< / t r >< t r >8 < t d s t y l e =" background−c o l o r : l i g h t b l u e ; wid th :125 px ; ">9 <b> I z b o r n i k ( Menu ) < / b>< br >

10 <a h r e f =" h t t p : / / www. w3schoo l s . com">HTML< br >11 <a h r e f =" h t t p : / / www. w3schoo l s . com">CSS< br >12 <a h r e f =" h t t p : / / www. w3schoo l s . com"> J a v a S c r i p t < b r >13 <a h r e f =" h t t p : / / www. w3schoo l s . com">JQuery< br >14 <a h r e f =" h t t p : / / www. w3schoo l s . com">XML< / t d >15 < t d s t y l e =" background−c o l o r : aqua ; h e i g h t : 200 px ; wid th :375 px ; ">16 Sadr \ v{ z } a j i d e o v d j e < / t d >< / t r >< t r >17 < t d c o l s p a n =" 2 " s t y l e =" background−c o l o r : rgb ( 1 0 0 , 2 0 0 , 2 5 5 ) ;18 t e x t −a l i g n : c e n t e r ; ">19 C o p y r i g h t Âc© W3Schools . com< / t d >< / t r >20 < / t a b l e >21 < / body>22 < / h tml >

HTML kod prikazan iznad ce proizvesti slijedeci rezultat:

10 Prva domaca zadaca

1.5 Višestupcani Layout - koristeci tablice

Kada bismo željeli zadržati svoj sadržaj u srednjem stupcu, lijevi stupac možemo koristitikao izbornik, a u desni stupac staviti reklamu ili neke druge stvari.Ovdje je primjer kako napraviti layout s tri stupca:

Program 1.6 Višestupcani layout

1 < !DOCTYPE html >2 <html >3 <body>4 < t a b l e wid th =" 700 " b o r d e r =" 0 ">5 < t r >< t d c o l s p a n =" 3 " s t y l e =" background−c o l o r : g r e e n ; ">6 <h1 s t y l e =" c o l o r : w h i t e "> Gla vn i Nas lov Web S t r a n i c e < / h1>7 < / t d >< / t r >< t r v a l i g n =" t o p ">8 < t d s t y l e =" background−c o l o r : l i g h t g r e e n ; wid th :20%;9 t e x t −a l i g n : t o p ; ">

10 <b> G la vn i I z b o r n i k < / b>< br / >11 HTML< br / >CSS< br / > J a v a S c r i p t . . . < / t d >12 < t d s t y l e =" background−c o l o r : l i g h t g r a y ; h e i g h t : 200 px ;13 wid th :60%; t e x t −a l i g n : t o p ; ">14 Sadr \ v{ z } a j i d e o v d j e < / t d >15 < t d s t y l e =" background−c o l o r : l i g h t g r e e n ;16 wid th :20%; t e x t −a l i g n : t o p ; ">17 <b>Desni I z b o r n i k < / b>< br / >18 PHP< br / >JQUERY< br / > XML . . .19 < / t d >< / t r >< t r >20 < t d c o l s p a n =" 3 " s t y l e =" background−c o l o r : g r e e n ;21 t e x t −a l i g n : c e n t e r ; ">22 < f o n t s t y l e =" c o l o r : w h i t e "> C o p y r i g h t Âc© W3Schools . com< / f o n t ><

/ t d >

1.6 HTML Iframe-ovi 11

23 < / t r >< t a b l e >24 < / body>25 < / h tml >

HTML kod prikazan iznad ce proizvesti slijedeci rezultat:

1.6 HTML Iframe-ovi

Iframe je element koji se koristi za prikaz web stranice unutar web stranice. Sintaksa zadodavanje iframe-a glasi:

Zaslon 1.1 <iframe src="URL"></iframe>

Gdje URL pokazuje na mjesto u zasebnoj stranici.

1.6.1 Iframe-postavke visine i širine

Atributi "height" i "width" se koriste za odredivanje visine i širine iframe-a. Vrijednostiatributa su po defaultu izraženi u pikselima, ali oni takoder mogu biti izraženi i u postocima(npr. "80%"). Neki stariji preglednici ne podržavaju iframe-ove, te u tom slucaju iframe nece bitividljiv.

Slijedeci primjer kreirat ce i-frame koji je širok i visok dvije stotine piksela a prikazuje stranicu"demo_iframe.htm":

Program 1.7 Iframe dimenzija 200x200

1 < !DOCTYPE html >2 <html >3 <body>4 < i f r a m e s r c =" demo_iframe . htm " wid th =" 200 " h e i g h t =" 200 ">< / i f r a m e

>5 < / body>6 < / h tml >

12 Prva domaca zadaca

1.6.2 Iframe - Uklanjanje okvira

"Frameborder" atribut odreduje hoce li se ili nece prikazati obrub oko iframe-a.Kako bismo uklonili obrub moramo postaviti vrijednosti atributa na "0":

Program 1.8 Iframe bez okvira

1 < !DOCTYPE html >2 <html >3 <body>4 < i f r a m e s r c =" demo_iframe . htm " f r a m e b o r d e r =" 0 ">< / i f r a m e >5 < / body>6 < / h tml >

1.6.3 Korištenje iframe-a kao metu za link

Iframe se može koristiti kao ciljni okvir za link. "Target" atribut od linka se mora odnositina atribut imena "name" iframe-a.

Program 1.9 Iframe kao link "target"

1 < !DOCTYPE html >2 <html >3 <body>4 < i f r a m e s r c =" demo_iframe . htm " name=" i f r a m e _ a ">< / i f r a m e >5 <p><a h r e f =" h t t p : / / www. w3schoo l s . com" t a r g e t =" i f r a m e _ a ">

1.6 HTML Iframe-ovi 13

6 W3Schools . com< / a>< / p>7 < / body>8 < / h tml >

Kontrola PristupaAutentifikacija

Ogranicenja kod registracijeCAPTCHA i reCAPTCHAPrilagodba AuthPreimenovanje Auth tablica

AutorizacijaSredišnja Autentifikacijska Služba

2 — Prvi seminarski rad

2.1 Kontrola Pristupa

Web2py ukljucuje mocan i prilagodljiv Role Based Access Control mehanizam (RBAC).Role-Based Access Control (RBAC) je pristup kojim se ogranicava dostupnost sustava ovlaštenimkorisnicima. To je noviji alternativni pristup obaveznoj kontroli pristupa (MAC) i diskrecijskojkontroli pristupa (DAC). RBAC se ponekad naziva i role-based security.

RBAC je o privatnosti neutralna i fleksibilna tehnologija kontrole pristupa dovoljno snažnada simulira DAC i MAC. Isto tako, MAC moze simulirati RBAC ako je graf uloga ogranicen nastablo umjesto da je djelomicno naredno postavljen.

Prije razvoja RBAC, MAC i DAC su se smatrali da su jedini poznati modeli za kontolu pristupa:ako model nije bio MAC, smatralo se da je DAC model, i obrnuto. Istraživanje u kasnim 1990-impokazalo je da RBAC ne spada u niti jednu kategoriju.

Unutar organizacije, uloge su stvorene za razne funkcije posla. Dozvole za obavljanje odredenihposlova dodjeljene su odredenim ulogama. Clanovima osoblja (ili drugim korisnicima sustava) sudodijeljene odredene uloge, a kroz te podjele uloga stjecanje dopuštenja za obavljanje odredenihsustavnih funkcija. Za razliku od kontekstno-bazirane kontrole pristupa (CBAC), RBAC ne gledau kontekst poruke (kao što je podrijetlo veze).

Buduci da korisnicima nisu dodijeljene dozvole izravno, nego su ih samo stekli kroz svojeuloge, menadžment pojedinacnih korisnickih prava postaje stvar jednostavnog dodjeljivanjaodgovarajucih uloga za korisnika; to pojednostavljuje uobicajene operacije, kao što su dodavanjekorisnika, ili mijenjanje korisnickog odjela.

RBAC se razlikuje od kontrole pristupa listama (ACL) koje se koriste u tradicionalnim dis-krecijskim sustavima kontrole pristupa u smislu da dodjeljuje dozvole za odredene operacijesa znacenjem u organizaciji, umjesto objektima s niskom razinom podataka. Na primjer, popiskontrole pristupa može se koristiti za davanje ili uskracivanje pristupa pisanju na odredenusustavnu datoteku, ali to ne diktira kako se ta datoteka može mijenjati. Web2py klasa koja

16 Prvi seminarski rad

implementira RBAC se naziva Auth.

Auth treba (i definira) sljedece tablice:• auth_user - sprema korisnicko ime, email adresu, šifru, i status (registracija u tijeku,

prihvaceno, blokirano)• auth_group - sprema grupu ili uloge za korisnike u many-in-many strukturu. Po zadanom,

svaki korisnik se nalazi u svojoj vlastitoj grupi, ali korisnik može biti i u više grupa, odkojih svaka može sadržavati više korisnika. Grupa je identificirana prema ulozi i opisu.

• auth_membership - povezuje korisnike i grupe u many-to-many structuru.• auth_permission - povezuje grupe i dozvole. Dopuštenje je indentificirano prema imenu i,

opcijsko, tablicom i zapisom. Na primjer, clanovi odredene skupine mogu imati "Update"dozvole na odredeni zapis za odredenu tablicu.

• auth_event - zapisnici promjena u drugim tablicama i uspješnog pristupa putem CRUDdo objekta pod nadzorom RBAC-a.

• auth_cas - se koristi za Središnju Autenctifikacijsku Službu (CAS - Cental AuthenticationService).

Shema je reproducirana graficki na slici ispod:

U principu, ne postoji ogranicenje na nazivima uloga i nazivima dozvola; programer ih možestvoriti da popravi uloge i dozvole u organizaciji. Jednom kad su stvoreni, web2py pruža API daprovjeri je li korisnik prijavljen, da li je korisnik clan neke grupe, i/ili ako je korisnik clan bilo

2.2 Autentifikacija 17

koje grupe koja ima danu potrebnu dozvolu.

Web2py takoder pruža dekoratere za ogranicavanje pristupa bilo kojoj funkciji koja se temelji naprijavi, clanstvu i dozvoli.

web2py takoder razumije neke posebne dozvole, tj., one koje imaju ime koje odgovara CRUDmetodama(kreirati, citati, ažurirati, brisati) i može ih provesti automatski, bez potrebe za korište-njem dekoratera. U ovom poglavlju, govoriti ce se o razlicitim dijelovima RBAC, jednom pojednom.

2.2 Autentifikacija

Da bi koristiti RBAC, korisnici trebaju biti identificirani. To znaci da im je potrebnoda se registriraju (ili da budu registrirani) i da se prijave. Auth pruža više prijavnih metoda.Zadana se sastoji od identifikacije korisnika na temelju lokalne auth_user tablice. Alternativno,može prijaviti korisnika protiv "third-party" autentifikacijskog sustava i jednokratno se prijavitina pružatelja usluga, kao što su Google, PAM, LDAP, Facebook, LinkedIn, Dropbox, OpenID,OAuth, itd...

Da bismo poceli koristiti Auth, trebamo barem ovaj kod u datoteci modela, koji je takoderpriložen uz web2py "Dobrodošli" aplikacijom i poprima vezni objekt db:

Program 2.1 Inicijalizacija Auth-a

1 from gluon . t o o l s i m p o r t Auth2 a u t h = Auth ( db )3 a u t h . d e f i n e _ t a b l e s ( )

Auth ima dodatni secure = True argument, koji ce prisiliti provjerene stranice da idu prekoHTTPS. Po defaultu, Auth štiti prijave protiv "cross-site" krivotvorenih zahtjeva (CSRF). To jezapravo osigurano sa web2py standardnom CSRF zaštitom kad god su obrasci generirani u sesiji.

Medutim, pod odredenim okolnostima, nadglavlje kreiranja sesije za prijavu, zahtjevi za lozin-kom i pokušaji reset-a mogu biti nepoželjni. DOS napadi su teoretski moguci. CSRF zaštitamože biti onemogucena za AUTH formu (od v2,6):

Program 2.2 Onemocivanje CSRF zaštite

1 Auth = Auth ( . . . , c s r f \ _ p r e v e n t i o n = F a l s e )

Imajmo na umu da je korištenje toga iskljucivo kako bi izbjegli sesijsko preopterecenje naprometnim stranicama nije preporucljivo zbog uvedenog sigurnosnog rizika.Umjesto toga, pogledajte poglavlje Deployment za savjet o smanjenju sesijskih nadglavlja.

Definicija 2.1 Polje lozinke za db.auth_user tablicu se postavlja na defaultni CRYPTvalidator, koji treba hmac_key. Na naslijedenim web2py aplikacijama možete vidjeti dodatniargument prenesen na AUTH konstruktora: hmac_key = Auth.get_or_create_key(). "Lat-ter" je funkcija koja cita HMAC kljuc iz datoteke "private/auth.key" unutar foldera aplikacije.Ako datoteka ne postoji stvara se "random" hmac_key. Ako više aplikacija dijeli istu auth

18 Prvi seminarski rad

bazu podataka pazite da one takoder koriste isti hmac_key. To više nije potrebno za noveaplikacije pošto su lozinke posoljene sa individualnom slucajnom soli.

Po defaultu, web2py koristi e-mail za prijavu. Ako se umjesto toga želite prijaviti koristecikorisnicko ime postavite auth.define_tables(username=True). Ako više aplikacija dijeli istuauth bazu podataka možda želite onemoguciti migracije: auth.define_tables(migrate=False).Za izlaganje Auth, takoder trebate sljedecu funkciju u kontoleru (primjerice u "default.py"):

Program 2.3 Auth funkcija

1 d e f u s e r ( ) : r e t u r n d i c t ( form= a u t h ( ) )

Definicija 2.2 Auth objekt i korisnicka akcija vec su definirani u skelastoj ("scaffolding")aplikaciji.

Web2py takoder ukljucuje primjere uzorka "welcome/views/default/user.html" da prikaže ovufunkciju ispravno, a ona izgleda ovako:

Program 2.4 Auth forma

1 {{ e x t e n d ’ l a y o u t . html ’ } }2 <h2>{{=T ( r e q u e s t . a r g s ( 0 ) . r e p l a c e ( ’ _ ’ , ’ ’ ) . c a p i t a l i z e ( ) ) }}< / h2

>3 < d i v i d =" web2py_user_form ">4 {{= form }}5 {{ i f r e q u e s t . a r g s ( 0 ) == ’ l o g i n ’ : } }6 {{ i f n o t ’ r e g i s t e r ’ i n a u t h . s e t t i n g s . a c t i o n s _ d i s a b l e d : } }7 < br / ><a h r e f =" {{=URL( a r g s = ’ r e g i s t e r ’ ) }} "> r e g i s t e r < / a>8 {{ p a s s }}9 {{ i f n o t ’ r e q u e s t _ r e s e t _ p a s s w o r d ’ i n a u t h . s e t t i n g s .

a c t i o n s _ d i s a b l e d : } }10 < br / >11 <a h r e f =" {{=URL( a r g s = ’ r e q u e s t _ r e s e t _ p a s s w o r d ’ ) }} "> l o s t

password < / a>12 {{ p a s s }}13 {{ p a s s }}14 < / d i v >

Uocite da ova funkcija jednostavno prikazuje formu i stoga se može prilagoditi koristecinormalan prilagodeni oblik sintakse. Jedino upozorenje je to da forma prikazana sa form=auth()ovisi o request.args(0); Stoga, ako zamijenite zadanu auth() prijavnu("login") formu s prilago-denom prijavnom formom, možda cete trebati if izjavu poput ove u prikazu:

Program 2.5 Prilagodeni prijavni obrazac

1 {{ i f r e q u e s t . a r g s ( 0 ) == ’ l o g i n ’ : } } . . . custom l o g i n form . . . { { p a s s }}

2.2 Autentifikacija 19

Kontrolor iznad izlaže više radnji:

Program 2.6

1 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / r e g i s t e r2 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / l o g i n3 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / l o g o u t4 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / p r o f i l e5 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / change_password6 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / v e r i f y _ e m a i l7 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / r e t r i e v e _ u s e r n a m e8 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / r e q u e s t _ r e s e t _ p a s s w o r d9 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / r e s e t _ p a s s w o r d

10 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / i m p e r s o n a t e11 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / g r ou ps12 h t t p : / / . . . / [ app ] / d e f a u l t / u s e r / n o t _ a u t h o r i z e d

• register - omogucuje korisniku da se registrira. To je integrirano zajedno s CAPTCHA-om, iako je po defaultu iskljuceno. To je takoder integrirano s "client-side" kalkulatoromentropije definiranim u "web2py.js". Kalkulator pokazuje snagu nove lozinke. Možetekoristiti IS_STRONG validator da sprijecite web2py od prihvacanja slabe lozinke.

• login - omogucuje registriranim korisnicima da se prijave (ako je registracija potvrdenaili ne zahtijeva potvrdu, ako je odobrena ili ne zahtijeva odobrenje, odnosno ako nijeblokirana).

• logout - cini ono što biste ocekivali, ali takoder, kao ostale metode, prijavljuje dogadaj, amože se koristiti za pokretanje nekog dogadaja.

• profile - omogucuje korisnicima da urede svoj profil, npr. sadržaj auth_user tablice.Uocite da ova tablica nema fiksnu strukturu i može se prilagoditi korisniku.

• change_password - omogucuje korisnicima da promijene svoju lozinku na siguran nacin.• vertify_email - Ako je e-mail potvrda ukljucena, tada posjetitelji, nakon registracije,

prime e-mail s linkom kako bi potvrdili svoje e-mail podatke. Link ukazuje na ovu akciju.• retrieve_username - Po dafaultu, Auth koristi e-mail i lozinku za prijavu, ali može, po

izboru, koristiti korisnicko ime umjesto e-maila. U ovom potonjem slucaju, ako korisnikzaboravi svoje korisnicko ime, retrieve_username metoda omogucava korisniku da upišee-mail adresu i dohvati korisnicko ime putem e-maila.

• request_reset_password - Omogucuje korisnicima koji su zaboravili svoju lozinku dazatraže novu lozinku. Oni ce dobiti potvrdni e-mail koji upucuje na reset_password.

• impersonate - omogucuje korisniku da "predstavlja" drugog korisnika. To je važno za ot-klanjanje pogrešaka i za svrhe podrške. request.args [0] je id korisnika koji se lažno pred-stavlja. Ovo je dopušteno samo ako prijavljeni korisnik has_permission("impersonate",db.auth_user, user_id). Možete koristiti auth.is_impersonating () da biste provjerili dali trenutni korisnik lažno predstavlja nekoga drugog.

• groups - navodi grupe od kojih je trenutni prijavljeni korisnik clan.• not_authorized - prikazuje poruku pogreške kada je posjetitelj pokušao uciniti nešto za

što nije ovlašten.• navbar - je pomocnik koji generira traku s prijava / registracija / itd. linkovima.

Logout, profile, change_password, impersonate, i groups zahtijevaju prijavu. Po defaultu susvi izloženi, ali moguce je ograniciti pristup samo nekim od tih radnji. Sve od gore navedenihmetoda mogu se proširiti ili zamijeniti sa podklasirajucom autentifikacijom ("subclassing Auth").Sve od gore navedenih metoda mogu se takoder koristiti u odvojenim akcijama. Na primjer:

20 Prvi seminarski rad

Program 2.7

1 d e f mylogin ( ) : r e t u r n d i c t ( form= a u t h . l o g i n ( ) )2 d e f m y r e g i s t e r ( ) : r e t u r n d i c t ( form= a u t h . r e g i s t e r ( ) )3 d e f m y p r o f i l e ( ) : r e t u r n d i c t ( form= a u t h . p r o f i l e ( ) )4 . . .

Da biste ogranicili pristup funkcijama samo prijavljenim posjetiteljima, ukrasite funkcijukao u sljedecem primjeru:

Program 2.8

1 @auth . r e q u i r e s _ l o g i n ( )2 d e f h e l l o ( ) :3 r e t u r n d i c t ( message = ’ h e l l o %( f i r s t _ n a m e ) s ’ % a u t h . u s e r )

Svaka funkcija može biti uredena, a ne samo izložena akcijama. Naravno, ovo je još uvijeksamo vrlo jednostavan primjer kontrole pristupa. Složeniji primjeri ce biti pojašnjeni kasnije.

auth.user_groups

Definicija 2.3 auth.user sadrži kopiju db.auth_user zapisa za trenutno prijavljenog koris-nika ili ne sadrži ništa. Postoji i auth.user_id što je isto kao i auth.user.id (tj. id trenutnogprijavljenog korisnika ). Slicno tome, auth.user_groups sadrži rjecnik, gdje je svaki kljuc idod grupe koja sadrži prijavljenog korisnika , vrijednost je odgovarajuca uloga grupe.

auth.requires_login() dekorater kao i ostali auth.requires_* dekorateri uzimaju dodatni argu-ment. Može se postaviti u niz ("string"), gdje preusmjeriti korisnika ako registracija ne uspije, ilina objekt koji se poziva ako registracija nije uspjela.

2.2.1 Ogranicenja kod registracije

Ako želite omoguciti posjetiteljima da se registriraju ali da se ne prijave dok registracijane bude odobrena od strane administratora:

Program 2.9

1 a u t h . s e t t i n g s . r e g i s t r a t i o n _ r e q u i r e s _ a p p r o v a l = True

Možete odobriti registraciju putem "appadmin" sucelja. Pogledajte u tablicu auth_user. Re-gistracije u tijeku imaju registration_key polje postavljeno na "pending" (u tijeku). Registracijaje odobrena kada je to polje prazno.

Preko appadmin sucelja, možete blokirati korisnika da se prijavi. Pronadite prijavljenog korisnikau tablici auth_user i postavite registration_key na "blocked". Blokiranim korisnicima nijedopuštena prijava. Uocite da ce to sprijeciti posjetitelja da se prijavi, ali nece prisiliti posjetiteljakoji je vec prijavljen da se odjavi. Rijec "disabled" može se koristiti umjesto "blocked", ako sepreferira, s tocno istim ponašanjem.Takoder možete blokirati pristup na "register" stranicu u potpunosti s ovom tvrdnjom:

Program 2.10

1 a u t h . s e t t i n g s . a c t i o n s _ d i s a b l e d . append ( ’ r e g i s t e r ’ )

2.2 Autentifikacija 21

Ako želite omoguciti ljudima da se registriraju i automatski ih prijaviti nakon registracije, alii dalje želite poslati e-mail za verifikaciju, tako da se ne mogu ponovno prijaviti nakon odjave,osim ako su završili upute u e-pošti, možete to ostvariti na sljedeci nacin:

Program 2.11

1 a u t h . s e t t i n g s . r e g i s t r a t i o n _ r e q u i r e s _ a p p r o v a l = True2 a u t h . s e t t i n g s . l o g i n _ a f t e r _ r e g i s t r a t i o n = True

Druge metode Auth-a mogu biti ogranicene na isti nacin.

2.2.2 CAPTCHA i reCAPTCHA

Da biste sprijecili "spamere" i "botove" da se registriraju na vašu stranicu, možete zahtije-vati registracijsku CAPTCHA-u. Web2py podržava reCAPTCHA-u sam po sebi. To je zato štoje reCAPTCHA vrlo dobro dizajnirana, besplatna, dostupna (može procitati rijeci za posjetitelje),lako postavljiva, te ne zahtijeva instalaciju bilo koje "third-party" biblioteke.

Ovo je ono što trebate uciniti da biste koristili reCAPTCHA-u:• Registrirajte se s reCAPTCHA-om i dobite (PUBLIC_KEY, PRIVATE_KEY) par za svoj

racun ("account"). To su samo dva string-a.• Dodajte sljedeci kod u svoj model nakon što je definiran objekt auth:

Program 2.12

1 from gluon . t o o l s i m p o r t Recap tcha2 a u t h . s e t t i n g s . c a p t c h a = Recap tcha ( r e q u e s t ,3 ’PUBLIC_KEY ’ , ’PRIVATE_KEY ’ )

ReCAPTCHA možda nece raditi ako pristupate web stranicama kao "localhost" ili "127 .0.0.1",jer je registrirana da radi samo s javno vidljivim web stranicama. ReCAPTCHA konstruktoruzima neke dodatne argumente:

Program 2.13

1 Recap tcha ( . . . , u s e _ s s l =True , e r r o r _ m e s s a g e = ’ i n v a l i d ’ , l a b e l = ’V e r i f y : ’ , o p t i o n s = ’ ’ )

Uocite da je use_ssl=False po defaultu. options mogu biti konfiguracijski string-ovi, npr.options="theme:’white’, lang:’fr’". Ako ne želite koristiti reCAPTCHA-u, pogledajte u defi-niciju Recaptcha klase unutar "gluon / tools.py", pošto je jednostavno koristiti druge CAPTCHAsustave.Uocite da ReCAPTCHA samo pomocnik koji proširuje DIV. On generira pseudo polje koje pot-vrduje korištenjem reCaptcha usluga i, stoga, se može koristiti u bilo kakvom obliku, ukljucujucii korisnicko definirane FORM-e:

Program 2.14

1 form = FORM( INPUT ( . . . ) , Recap t cha ( . . . ) , INPUT ( _ t y p e = ’ submi t ’ ) )

Može se koristiti u svim vrstama SQLFORM-a injekcijom:

Program 2.15

22 Prvi seminarski rad

1 form = SQLFORM ( . . . ) o r SQLFORM. f a c t o r y ( . . . )2 form . e l e m e n t ( ’ t a b l e ’ ) . i n s e r t (−1 ,TR( ’ ’ , Recap tcha ( . . . ) , ’ ’ ) )

2.2.3 Prilagodba Auth

Poziv auth.define_tables() definira sve Auth tablice koje nisu bile vec definirane. Toznaci da, ako želite tako uciniti, možete definirati svou vlastitu auth_user tablicu. Postojinekoliko nacina prilagodbe auth. Najjednostavniji nacin je da se dodaju dodatna polja:

Program 2.16

1 ## a f t e r a u t h = Auth ( db )2 a u t h . s e t t i n g s . e x t r a _ f i e l d s [ ’ a u t h _ u s e r ’ ] = [3 F i e l d ( ’ a d d r e s s ’ ) ,4 F i e l d ( ’ c i t y ’ ) ,5 F i e l d ( ’ z ip ’ ) ,6 F i e l d ( ’ phone ’ ) ]7 ## b e f o r e a u t h . d e f i n e _ t a b l e s ( username =True )

Možete deklarirati dodatna polja ne samo za tablicu "auth_user", nego i za druge "auth_"tablice. Korištenje extra_fields je preporuceni nacin koji nece slomiti niti jedan unutarnjimehanizam.Drugi nacin za to, iako se stvarno ne preporucuje, sastoji se od definiranja vlastitih auth tablicasamostalno. Ako je tablica deklarirana prije auth.define_tables() onda se koristi umjesto zadane.Evo kako to uciniti:

Program 2.17

1 ## a f t e r a u t h = Auth ( db )2 db . d e f i n e _ t a b l e (3 a u t h . s e t t i n g s . t a b l e _ u s e r _ n a m e ,4 F i e l d ( ’ f i r s t _ n a m e ’ , l e n g t h =128 , d e f a u l t = ’ ’ ) ,5 F i e l d ( ’ l a s t_name ’ , l e n g t h =128 , d e f a u l t = ’ ’ ) ,6 F i e l d ( ’ emai l ’ , l e n g t h =128 , d e f a u l t = ’ ’ , u n i que =True ) , #

r e q u i r e d7 F i e l d ( ’ password ’ , ’ password ’ , l e n g t h =512 , #

r e q u i r e d8 r e a d a b l e = F a l s e , l a b e l = ’ Password ’ ) ,9 F i e l d ( ’ a d d r e s s ’ ) ,

10 F i e l d ( ’ c i t y ’ ) ,11 F i e l d ( ’ z ip ’ ) ,12 F i e l d ( ’ phone ’ ) ,13 F i e l d ( ’ r e g i s t r a t i o n _ k e y ’ , l e n g t h =512 , #

r e q u i r e d14 w r i t a b l e = F a l s e , r e a d a b l e = F a l s e , d e f a u l t = ’ ’ ) ,15 F i e l d ( ’ r e s e t _ p a s s w o r d _ k e y ’ , l e n g t h =512 , #

r e q u i r e d16 w r i t a b l e = F a l s e , r e a d a b l e = F a l s e , d e f a u l t = ’ ’ ) ,17 F i e l d ( ’ r e g i s t r a t i o n _ i d ’ , l e n g t h =512 , #

r e q u i r e d

2.2 Autentifikacija 23

18 w r i t a b l e = F a l s e , r e a d a b l e = F a l s e , d e f a u l t = ’ ’ ) )19

20 ## do n o t f o r g e t v a l i d a t o r s21 c u s t o m _ a u t h _ t a b l e = db [ a u t h . s e t t i n g s . t a b l e _ u s e r _ n a m e ] # g e t t h e

c u s t o m _ a u t h _ t a b l e22 c u s t o m _ a u t h _ t a b l e . f i r s t _ n a m e . r e q u i r e s = IS_NOT_EMPTY(

e r r o r _ m e s s a g e = a u t h . messages . i s _ e m p t y )23 c u s t o m _ a u t h _ t a b l e . l a s t _ n a m e . r e q u i r e s = IS_NOT_EMPTY(

e r r o r _ m e s s a g e = a u t h . messages . i s _ e m p t y )24 c u s t o m _ a u t h _ t a b l e . password . r e q u i r e s = [ IS_STRONG ( ) , CRYPT ( ) ]25 c u s t o m _ a u t h _ t a b l e . e m a i l . r e q u i r e s = [26 IS_EMAIL ( e r r o r _ m e s s a g e = a u t h . messages . i n v a l i d _ e m a i l ) ,27 IS_NOT_IN_DB ( db , c u s t o m _ a u t h _ t a b l e . e m a i l ) ]28

29 a u t h . s e t t i n g s . t a b l e _ u s e r = c u s t o m _ a u t h _ t a b l e # t e l l a u t h t o usec u s t o m _ a u t h _ t a b l e

30

31 ## b e f o r e a u t h . d e f i n e _ t a b l e s ( )

Možete dodati bilo koje polje koje želite, a možete promijeniti i validatore, ali ne možeteukloniti polja oznacena kao "required" u ovom primjeru. Važno je napraviti "password", "regis-tration_key", "reset_password_key" i "registration_id" polja readable=False i writable=False,buduci da posjetitelju ne smije biti dopušteno da cacka po njima.Ako dodate polje pod nazivom "username", ono ce se koristiti umjesto "email" za prijavu. Akoucinite tako, morat cete dodati validatora:

Program 2.18

1 a u t h _ t a b l e . username . r e q u i r e s = IS_NOT_IN_DB ( db , a u t h _ t a b l e .username )

2.2.4 Preimenovanje Auth tablica

Stvarna imena auth tablica su pohranjena u:

Program 2.19

1 a u t h . s e t t i n g s . t a b l e _ u s e r _ n a m e = ’ a u t h _ u s e r ’2 a u t h . s e t t i n g s . t a b l e _ g r o u p _ n a m e = ’ au th_group ’3 a u t h . s e t t i n g s . t ab le_membersh ip_name = ’ auth_membership ’4 a u t h . s e t t i n g s . t a b l e _ p e r m i s s i o n _ n a m e = ’ a u t h _ p e r m i s s i o n ’5 a u t h . s e t t i n g s . t a b l e _ e v e n t _ n a m e = ’ a u t h _ e v e n t ’

Imena tablice mogu se mijenjati preraspodjelom gore navedenih varijabli nakon što je authobjekt definiran i prije nego što su definirane Auth tablice.Na primjer:

Program 2.20

1 a u t h = Auth ( db )2 a u t h . s e t t i n g s . t a b l e _ u s e r _ n a m e = ’ person ’

24 Prvi seminarski rad

3 # . . .4 a u t h . d e f i n e _ t a b l e s ( )

Stvarne tablice se takoder mogu referencirati, neovisno o njihovim stvarnim imenima, prema:

Program 2.21

1 a u t h . s e t t i n g s . t a b l e _ u s e r2 a u t h . s e t t i n g s . t a b l e _ g r o u p3 a u t h . s e t t i n g s . t a b l e _ m e m b e r s h i p4 a u t h . s e t t i n g s . t a b l e _ p e r m i s s i o n5 a u t h . s e t t i n g s . t a b l e _ e v e n t

2.3 Autorizacija

Jednom kada je novi korisnik registriran, kreirana je nova grupa koja sadrži korisnika.Uloga novog korisnika je konvencionalno "user_[id]" gdje [id] predstavlja id novonastalogkorisnika. Stvaranje grupe može se iskljuciti pomocu:

Program 2.22

1 a u t h . s e t t i n g s . c r e a t e _ u s e r _ g r o u p s = None

iako se ne sugerira takav cin. Uocite da create_user_groups nije boolean (iako može bitiFalse) vec je defaultno:

Program 2.23

1 a u t h . s e t t i n g s . c r e a t e _ u s e r _ g r o u p s =" u s e r _ %( i d ) s "

To pohranjuje predložak za ime grupe kreirane za korisnicki id. Korisnici imaju clanstvo ugrupama. Svaka grupa je identificirana po nazivu/ulozi. Grupe imaju dozvole. Korisnici imajudozvole zbog grupa kojima pripadaju. Po defaultu svaki korisnik je napravljen clanom vlastitegrupe.

Takoder možete napraviti:

Program 2.24

1 a u t h . s e t t i n g s . e v e r y b o d y _ g r o u p _ i d = 5

da bi svaki novi korisnik automatski postao clanom grupe broj 5. Ovdje se 5 koristi kaoprimjer i pretpostavljeno je da je grupa vec stvorena. Možete kreirati grupe, dati clanstvo idozvole putem appadmin-a ili programski pomocu sljedecih metoda:

Program 2.25

1 a u t h . add_group ( ’ r o l e ’ , ’ d e s c r i p t i o n ’ )

vraca id novonastale grupe.

2.3 Autorizacija 25

Program 2.26

1 a u t h . d e l _ g r o u p ( g r o u p _ i d )

briše grupu s group_id.

Program 2.27

1 a u t h . d e l _ g r o u p ( a u t h . i d _ g r o u p ( ’ use r_7 ’ ) )

briše grupu s ulogom "user_7", tj. grupu jedinstveno povezanu s korisnikom broj 7.

Program 2.28

1 a u t h . u s e r _ g r o u p ( u s e r _ i d )

vraca id grupe jedinstveno povezane s korisnikom identificiranim pomocu user_id.

Program 2.29

1 a u t h . add_membership ( g roup_ id , u s e r _ i d )

daje user_id clanstvo u grupi group_id. Ako user_id nije specificiran, onda web2pypretpostavlja trenutno prijavljenog korisnika.

Program 2.30

1 a u t h . de l_membersh ip ( g roup_ id , u s e r _ i d )

oduzima user_id clanstvo u grupi group_id. Ako user_id nije specificiran, onda web2pypretpostavlja trenutno prijavljenog korisnika.

Program 2.31

1 a u t h . has_membership ( g roup_ id , u s e r _ i d , r o l e )

provjerava da li user_id posjeduje clanstvo u grupi group_id ili u grupi sa specificiranomulogom. Samo group_id ili role bi trebali biti preneseni u funkciju, ne oboje. Ako user_id nijespecificiran, onda web2py pretpostavlja trenutno prijavljenog korisnika.

Program 2.32

1 a u t h . a d d _ p e r m i s s i o n ( g roup_ id , ’ name ’ , ’ o b j e c t ’ , r e c o r d _ i d )

daje dozvolu "name" (definirano od korisnika) na objektu "objekt" (takoder definirano odkorisnika) clanovima grupe group_id. Ako je "object" ime tablice onda se dopuštenje možeodnositi na cijelu tablicu postavljanjem vrijednosti record_id u nulu, ili se dopuštenje možeodnositi na odredeni zapis postavljanjem vrijednosti record_id na vecu od nule.

Prilikom davanja dozvola za tablice, uobicajeno je koristiti ime dozvole u skupu (’create’,’read’, ’update’, ’delete’, ’select’) buduci da su ove dozvole razumljive i mogu se provoditipomoc CRUD APIs-a.Ako je group_id jednak nuli, web2py koristi grupu jedinstveno povezanu s trenutno prijavljenimkorisnikom. Takoder možete koristiti auth.id_group(role = "...") kako biste dobili id grupekojoj je dan taj naziv.

26 Prvi seminarski rad

Program 2.33

1 a u t h . d e l _ p e r m i s s i o n ( g roup_ id , ’ name ’ , ’ o b j e c t ’ , r e c o r d _ i d )

oduzima dozvolu.

Program 2.34

1 a u t h . h a s _ p e r m i s s i o n ( ’ name ’ , ’ o b j e c t ’ , r e c o r d _ i d , u s e r _ i d )

provjerava da li korisnik identificiran po user_id ima clanstvo u grupi s traženom dozvolom.

Program 2.35

1 rows = db ( a u t h . a c c e s s i b l e _ q u e r y ( ’ read ’ , db . mytable , u s e r _ i d ) ). s e l e c t ( db . my tab le . ALL)

vraca sve retke tablice "mytable" od kojih korisnik user_id ima "read" dozvolu. Akouser_id nije specificiran, onda web2py pretpostavlja trenutno prijavljenog korisnika. accessi-ble_query(...) se može kombinirati s drugim upitima kako bi napravili mnogo složenije upite.accessible_query(...) je jedina Auth metoda koja zahtijeva JOIN, tako da ne radi na GoogleApp Engine-u.

Uz pretpostavku sljedece definicije:

Program 2.36

1 >>> from gluon . t o o l s i m p o r t Auth2 >>> a u t h = Auth ( db )3 >>> a u t h . d e f i n e _ t a b l e s ( )4 >>> s e c r e t s = db . d e f i n e _ t a b l e ( ’ document ’ , F i e l d ( ’ body ’ ) )5 >>> james_bond = db . a u t h _ u s e r . i n s e r t ( f i r s t _ n a m e = ’ James ’ ,6 l a s t _ n a m e = ’Bond ’ )

Evo primjera:

Program 2.37

1 >>> doc _ i d = db . document . i n s e r t ( body = ’ t o p s e c r e t ’ )2 >>> a g e n t s = a u t h . add_group ( r o l e = ’ S e c r e t Agent ’ )3 >>> a u t h . add_membership ( a g e n t s , james_bond )4 >>> a u t h . a d d _ p e r m i s s i o n ( a g e n t s , ’ read ’ , s e c r e t s )5 >>> p r i n t a u t h . h a s _ p e r m i s s i o n ( ’ read ’ , s e c r e t s , doc_id ,

james_bond )6 True7 >>> p r i n t a u t h . h a s _ p e r m i s s i o n ( ’ upda te ’ , s e c r e t s , doc_id ,

james_bond )8 F a l s e

2.4 Središnja Autentifikacijska Služba

Web2py pruža podršku za "third party" autentifikaciju i jednokratne prijave. Ovdje cemoraspravljati o Središnjoj Autentifikacijskoj Službi (CAS ili Central Authentication Service) koja

2.4 Središnja Autentifikacijska Služba 27

je industrijski standard te su oboje, klijent i server, ugradeni u web2py.

CAS je otvoreni protokol za distribuiranu autentifikaciju i radi na sljedeci nacin: Kada posjetiteljdode na našu web stranicu, naš program provjerava u sesiji da li je korisnik vec autentificiran(primjerice preko session.token objekta). Ako korisnik nije autentificiran, kontroler preusmje-rava posjetitelja iz CAS uredaja, gdje se korisnik može prijaviti, registrirati, i upravljati svojimvjerodajnicama (imenom, email-om i lozinkom).

Ako se korisnik registrira, on prima e-mail, a registracija nije potpuna dok ne odgovori nataj e-mail. Jednom kada je korisnik uspješno registriran i prijavljen, CAS uredaj preusmjeravakorisnika na našu aplikaciju zajedno s kljucem. Naš program koristi kljuc kako bi dobio vjero-dajnice od korisnika putem HTTP zahtjeva u pozadini CAS servera.

Koristeci ovaj mehanizam, više aplikacija može koristi jedan "sign-on" preko jednog CASservera. Server koji pruža autentifikaciju se naziva pružatelj usluga. Aplikacije koje traže daautenificiraju posjetitelja nazivaju se korisnicke usluge.

CAS je slican OpenID-u, s jednom glavnom razlikom. U sluqvcaju OpenID, posjetitelj odabirepružatelja usluga. U slucaju CAS-a, naša aplikacija cini ovaj izbor, cineci CAS više sigurnijim.Pokretanje web2py CAS pružatelja je lako kao kopiranje skelaste aplikacije. U stvari bilo kojaweb2py aplikacija koja izlaže akciju

Program 2.38

1 ## i n p r o v i d e r app2 d e f u s e r ( ) : r e t u r n d i c t ( form= a u t h ( ) )

je CAS 2.0 pružatelj i njenim uslugama se može pristupiti na URL-u

Program 2.39

1 h t t p : / / . . . / p r o v i d e r / d e f a u l t / u s e r / c a s / l o g i n2 h t t p : / / . . . / p r o v i d e r / d e f a u l t / u s e r / c a s / v a l i d a t e3 h t t p : / / . . . / p r o v i d e r / d e f a u l t / u s e r / c a s / l o g o u t

Možete pristupiti ovoj usluzi iz bilo koje druge web aplikacije, jednostavno delegiranjemautenticnosti pružatelju:

Program 2.40

1 ## i n consumer app2 a u t h = Auth ( db , c a s _ p r o v i d e r = ’ h t t p : / / 1 2 7 . 0 . 0 . 1 : 8 0 0 0 / p r o v i d e r /

d e f a u l t / u s e r / cas ’ )

Kada posjetite URL za prijavu na potrošacku aplikaciju, ona ce vas preusmjeriti na pružatelj-sku aplikaciju koja ce vršiti autentifikaciju te ce se preusmjeriti natrag na potrošaca. Svi procesiregistracije, odjava, promjena lozinke, dohvacanje lozinke, moraju biti završeni na pružateljskojaplikaciji.

Unos ("entry") o prijavljenom korisniku ce biti kreiran na strani potrošaca, tako da možetedodati dodatna polja i imati lokalni profil. Zahvaljujuci CAS 2.0 sva polja koja su citljiva napružatelju te imaju odgovarajuce polje u auth_user tablici potrošaca ce se kopirati automatski.

28 Prvi seminarski rad

Auth(..., cas_provider = ’...’) radi s "third party" pružateljima usluga i podržava CAS 1,0i 2,0. Verzija se automatski prepoznaje. Po defaultu to izgraduje URL-ove od pružatelja iz baze(cas_provider url iznad) dodavanjem:

Program 2.41

1 / l o g i n2 / v a l i d a t e3 / l o g o u t

To se može promijeniti u potrošacu i pružatelju:

Program 2.42

1 ## i n consumer o r p r o v i d e r app ( must match )2 a u t h . s e t t i n g s . c a s _ a c t i o n s [ ’ l o g i n ’ ] = ’ l o g i n ’3 a u t h . s e t t i n g s . c a s _ a c t i o n s [ ’ v a l i d a t e ’ ] = ’ v a l i d a t e ’4 a u t h . s e t t i n g s . c a s _ a c t i o n s [ ’ l o g o u t ’ ] = ’ l o g o u t ’

Ako se želite spojiti na web2py CAS pružatelja iz druge domene, morate ih omogucitidodavanjem na popis dozvoljenih domena:

Program 2.43

1 ## i n p r o v i d e r app2 a u t h . s e t t i n g s . cas_domains . append ( ’ example . com ’ )

Literatura

Knjige

Clancihttp://www.w3schools.comhttp://www.techterms.comhttp://desktoppub.about.comhttp://www.tizag.com/htmlT/htmldiv.phphttp://web2py.com/books/default/chapter/29/09/access-control