Formuláře – kontrola práv
- Rypi
- Člen | 38
Ahoj,
mám třeba GalleryPresenter a v něm je mimo následující kód. Jak
elegantně (a bezpečně) zajistit, aby někdo nemohl podvrhnout formulář a
odeslat ho i přesto, že není přihlášen? Zkopírovat tu samou kontrolu?
V tomto případě nechci použít jiný presenter…
Díky :)
public function actionAdd()
{
if (!$this->getUser()->isLoggedIn()) {
$this->flashMessage('Nemate prava');
$this->redirect('default');
}
}
protected function createComponentAddForm()
{
}
protected function addFormSubmitted()
{
}
- Šaman
- Člen | 2666
Jj, zkopírovat ji. Já ji mám dokonce třikrát – jednou při zobrazení stránky (to už máš), podruhé při odeslání formuláře a potřetí při ukládání (už v rámci modelu – i když na kontrole uvnitř modelu panují rozporuplné názory).
Můžeš si v BasePresenteru vytvořit nějakou metodu checkRights, která ti v případě neúspěchu hodí hlášku a přesměruje (bude v ní celý kód toho, co máš teď v actionAdd). A tu pak zavoláš pokaždé, pokud by se na dané místo mohl nějak dostat nezkontrolovaný uživatel.
- kuty.cz
- Člen | 33
Taky ve většině případů kopíruju. Sice teda nepoužívám v modelu, protože tam to podle mne nepatří, ale jinak je řešení jak psal kolega výše. Kontrola by měla být jak při vyvolání např. editačního okna, které se naplňuje, tak i při ukládání.
Používám ještě i role, takže například pro admin akce používám admin presenter, který to kontroluje rovnou ve startupu.
- llook
- Člen | 407
Provádět tu samou kontrolu v createComponentAddForm()
. Pokud
ti je proti srsti Ctrl-C Ctrl-V, tak vyčlenit metodu, jak radí Šaman. Kontrola při
zpracování v addFormSubmitted()
je zbytečná, ale ničemu
nevadí (aby se zavolal onSuccess
musí se formulář nejdřív
vytvořit a přitom se zavolá ta kontrola v
createComponentAddForm()
).
Jak se píše ve všech tramvajích – better safe than sorry.
- Jiří Nápravník
- Člen | 710
Pokud mám jen akci, v které naplním formulář. A pak v šabloně zavolám {control $form} nemělo by pak stačít jen hlídat prává v továrničce na ten formulář? Protože se v podstatě taky nezobrazí, když zjistím, že práva jsou špatně? Nebo mi něco uniká?
Jinak když tu někdo píše, že v modelu nekontroluje práva. Jak to pak řešíte, když chcete udělat třeba api, nebo podobně? To pak je zbytečné duplikování kontroly. Model by měl být v podstatě přenositelný i když se vyhodí presenter a view, a tak si myslím, že kontrola v modleu je ze všeho nejdůležitější. Pokud se zapomene v presenteru, tak to až tak nevadí zobrazí se formulář, ale už neuloží nijak (protože to kontroluje pak model).
- kuty.cz
- Člen | 33
Jiří Nápravník napsal(a):
Pokud mám jen akci, v které naplním formulář. A pak v šabloně zavolám {control $form} nemělo by pak stačít jen hlídat prává v továrničce na ten formulář? Protože se v podstatě taky nezobrazí, když zjistím, že práva jsou špatně? Nebo mi něco uniká?
Asi máš pravdu, ale já kontroluju při action a při submitu, protože mi to přijde logičtější. Kontroluji při načítání a pak při odesílání a vím, že mam pokryto to, co se může stát. Samozřejmě nette spouští create i při odeslání, ale tam to podle mne logicky nepatří. Navíc jedna věc je pokud práva na formulář jsou nebo ne nebo pokud formulář mít může každý a kontroluje se oprávnění až podle id daného záznamu a to už zase trošku souvisí i s tím, kde nastavovat default hodnoty formuláře což se tu řešilo už mockrát..
Jiří Nápravník napsal(a):
Jinak když tu někdo píše, že v modelu nekontroluje práva. Jak to pak řešíte, když chcete udělat třeba api, nebo podobně? To pak je zbytečné duplikování kontroly. Model by měl být v podstatě přenositelný i když se vyhodí presenter a view, a tak si myslím, že kontrola v modleu je ze všeho nejdůležitější. Pokud se zapomene v presenteru, tak to až tak nevadí zobrazí se formulář, ale už neuloží nijak (protože to kontroluje pak model).
Je to podle mne otázka pohledu. Model pracuje s daty a proto podle mne do něj nepatří kontrola, jestli daný uživatel na ta data oprávnění má nebo ne, o to se stará presenter. Model je dělník, kterýmu řeknu jaká chci data a on to má udělat a presenter je šéf, který ho úkoluje.
Pokud jako šéf něco řeknu podřízenému aby udělal, ale on to prostě neudělá protože nechce, pak je to pro mne špatný zaměstnanec. Něco jiného je napríklad logika dat, kdy model jako odpovědný za data třeba nevykoná delete, protože je tam nějaká vazba.
Editoval kuty.cz (8. 11. 2013 9:25)