Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Java na webovém serveru: autorizace a autentizace II

Vít Šesták aura:72
5. 3. 2010 9:03

Token do URL nepatří!

celé vlákno

Chtěl bych protestovat proti tokenu v URL. Pokud bude na té stránce nějaký odkaz ven, musíme si dávat bacha na ně, protože mohou token získat z refereru. V tomto případě to asi vadit nebude, protože token se po použití stává asi ihned k ničemu, ale přesto si myslím, že to není dobré takto učit.

Franta Kučera aura:90
5. 3. 2010 9:21

Re: Token do URL nepatří!

celé vlákno

V případě jednorázového tokenu to problém není, klidně v URL být může. Je dobré napsat, že když jednorázový není, je potřeba ho předávat přes POST, ne GET, ale tady si člověk může vybrat (což se hodí např. pokud bychom požadovali potvrzení e-mailem – odkaz odkaz s GET parametrem vložíme i do textového mailu, pro POST bychom museli posílat e-mail v HTML a s formulářem, což je dost omezující).

Vít Šesták aura:72
5. 3. 2010 9:22

Re: Token do URL nepatří!

celé vlákno

Zajímavý argument, nicméně bych ho radši viděl přímo ve článku.

Vít Šesták aura:72
5. 3. 2010 9:07

Bacha na obecné nastavování beans!

celé vlákno

Proti tomuto nastavování beans bych také něco měl:
* Nerozlišuje to GET a POST.
* Nekontroluje to proti definici formuláře, takže je někdy možné podstrčit i něco navíc.

Druhý bod si lze představit třeba na editaci uživatelského profilu. Jakmile do uživatele přidáme nějaká oprávnění (dobře, na ty jsou spíš role) nebo informace typu VIP/non-VIP, může je uživatel se změnou profilu měnit také.

Právě proto se hodí nějaká knihovna pro formuláře a svázat to s ní.

Franta Kučera aura:90
5. 3. 2010 10:11

Re: Bacha na obecné nastavování beans!

celé vlákno

Na rozdílu GET/POST moc nesejde – podvrhnout se dá jedno i druhé, obojí pochází od uživatele a nemáme je pod kontrolou – je potřeba k nim přistupovat stejně nedůvěřivě (stejně jako ke cookie, http refererům a dalším informacím přicházejícím od klienta).

To nastavování pomocí property="*" je dost šikovné, člověk nemusí otrocky vypisovat všechny vlastnosti. Většinou se použije pro nastavení vlastnosti JavaBeany (v tomto případě registraceUzivatele), která obsahuje jen ty metody (settery jen pro ty GET/POST parametry, které jsou přípustné), které nás zajímají a které z HTTP požadavku chceme vydolovat – pak z toho máme proměnné uvnitř javovské třídy, se kterými se pracuje daleko lépe než v JSP – minimalizujeme programování v JSP (které se má starat jen generování HTML a předávání uživatelských vstupů – logiky by v něm mělo být co nejméně) a přesouváme ho do Javy.

„Jakmile do uživatele přidáme nějaká oprávnění…“

To je pravda, ale tohle zabezpečení je potřeba řešit v nižších vrstvách aplikace – nespoléhat se na to, že jsme (nebo nějaká knihovna) v JSP nastavili objektu jen ty vlastnosti, které jsme měli. Ty kontroly (které v současnosti zatím nejsou potřeba) by se měly provádět co nejníž (v EJB) – protože jednou třeba přidáme alternativní prezentační vrstvu (např. verzi stránek pro mobilní zařízení) a tam kontroly zapomeneme dát (nebo nezapomeneme, ale znamená to duplikaci logiky).

Robustnější by bylo, neposílat instanci třídy Uzivatel, ale založit si na to zvláštní třídu PozadavekNaRegistraci, která by obsahovala jen ty vlastnosti, které jsou v registračním formuláři (v současnosti by obsahovala to, co obsahuje Uzivatel). Je to takové balancování – snažím se ukázat, co všechno Java nabízí, ale zároveň nezahltit čtenáře tunou kódu. Schválně to takhle přepíšu, ale běda jak mi někdo vynadá :-) a řekne „hej kámo, ta tvoje aplikace umí akorát uložit záznam do databáze a pak ho načíst – a potřebuješ na to milion tříd a dvě vrstvy.“ :-) Zatímco on by si vzal třeba PHP a v jednom skriptu v něm nasekal GET/POST parametry rovnou do SELECTů/INSERTů a poslal do DB. A měl radost z toho, jako pěknou aplikaci napsal. To samozřejmě v Javě jde taky (viz 3. díl – JSP SQL značky). Člověk se prostě nikdy nezavděčí všem (zvlášť když dělá otevřený software a ještě o tom píše :-)

Vít Šesták aura:72
5. 3. 2010 10:17

Re: Bacha na obecné nastavování beans!

celé vlákno

Neříkám, že GET/POST je důležitý bezpečnostní rozdíl (za určitých podmínek teda ano), ale už z principu to není dobré mixovat.

Formulářové knihovny jsou asi až ve frameworcích, že? Ta třída PozadavekNaRe­gistraci je sice možná, ale… …ale i tady je určitá duplikace – jednou je seznam povolených ve formuláři a jednou ve třídě PozadavekNaRe­gistraci. Nějaká formulářová knihovna takovéto data binding přece umožňuje, nebo ne?

kvr kvr aura:93
5. 3. 2010 10:15

DB definice pro uživatele

celé vlákno

Článek dobrý a autorovi posílám pochvalu za celou sérii.

V tomto dílu mě ale zarazila definice tabulek pro uzivatel_role – referencovat „prezdivka“ místo primárního klíče mi trochu skřípe, zvláště, když nevidím ani žádné zjevné výhody. Je to kvůli nějakému omezení, třeba v rámci definice JDBCRealm?

Franta Kučera aura:90
5. 3. 2010 10:34

Re: DB definice pro uživatele

celé vlákno

Ano, je to tím JDBCRealmem – on by se jinak uživatel musel přihlašovat svým ID, což by se mu jistě nelíbilo. Vidím to na napsání vlastního přihlašovacího modulu (nejen z tohoto důvodu), ale to se do tohoto dílu nevešlo – ve zdrojácích se ale dříve nebo později objeví, takže o něj nepřijdete :-)

Tomáš J. Kouba
Tomáš J. Kouba (neregistrovaný) ---.neo.cz
5. 3. 2010 15:39

Role

celé vlákno

Děkuji za zajímavý článek. Dodám svůj názor na jeden detail. Osobně se domnívám, že tabulka Role je nesmyslná. Myslím, že je lepší seznam rolí uložit do aplikace, přímo do kódu nebo nastavení webu. Pokud se totiž změní požadavek na role, je asi vždy nutné změnit kód aplikace. Pak mám v databázi zbytečnou tabulku do které kladu zbytečné dotazy.

Mějte se hezky

Franta Kučera aura:90
5. 3. 2010 21:17

Re: Role

celé vlákno

Ona tam trochu navíc je – autentizace by fungovala i bez ní, dotazy se do ní nekladou – je tam hlavně pro kontrolu – referenční integrita nám zajistí, že v tabulce uzivatel_role se neobjeví žádná neexistující role (nešla by ani vložit, musí být nejdřív v číselníkové tabulce). Tohle by šlo i bez tabulky, třeba pomocí Check Constraints, ale to bychom pak při přidání role museli dělat DDL – takhle stačí DML (přidat záznam do tabulky).

Musím ale přiznat, že datový model uživatelů/rolí není úplně podle mých představ – musel se dost přizpůsobit tomu, co předpokládá  JDBCRealm.

Petr
Petr (neregistrovaný) 93.185.62.---
5. 3. 2010 17:56

Realmy na hostinzích

celé vlákno

Vypadá to hezky, ale zajímá mě, jak to bývá implementované na různých Java hostinzích.

Application-level nastavení bude asi v tom WAR souboru, ale nastavení toho realmu je už nastavení serveru.

Dovolují mi toto běžné Java hostingy taky nastavit ?

baboon
baboon (neregistrovaný) ---.sh.cvut.cz
3. 5. 2010 19:57

Nastavení realmu s jednou tabulkou

celé vlákno

Díky za bezva rady ohledně realmu. Měl bych jeden dotaz, je možné nastavit realm z databáze tak, že v databázi mám pouze jednu tabulku „uzivatel“, který má atribut role? Nějak se mi to bohužel nedaří.

Zasílat nově přidané příspěvky e-mailem