errorPresenter, signPresenter?
- David Grudl
- Nette Core | 8218
Potřebuju nějak vyřešit, kam se bude přesměrovávat, když se narazí
v presenteru na anotaci @User(loggedIn)
a uživatel nebude
přihlášen. Dělat bratříčka errorPresenteru nechci, jednak bych nerad
přidával závislost presenteru na application a taky by to trpělo problémem
s různými SignPresentery v různých modulech. Přitom je to věc podobná
na errorPresenter.
Nějaké nápady?
- bojovyletoun
- Člen | 667
https://forum.nette.org/…a-checkroles
Možná přidat anotaci určující co se stane ( teď mě napadlo
@authFail Xyz, kde xyz je buď redirect, terminate, throw)
- paranoiq
- Člen | 392
je to zodpovědnost presenteru, který je takovou anotací označen. měl by
mít událost onLogin (nebo lepší název) implementovat rozhraní,
které by dostávalo PresenterRequest a samo zajistilo přesměrování tam kam
potřebuje. tím se vyřeší i moduly atd.
pokud takové rozhraní nemá, pak ErrorPresenter a HTTP 401
systémový LoginPresenter udělat nejde (Nette neví jak je v aplikaci zařízeno přihlašování), ale mohl by se registrovat, tak jak je to u ErrorPresenterů
tedy fallback:
- přesměrování přes rozhraní presenteru
- uživatelem nastavený defaultní LoginPresenter
- ErrorPresenter 401
Editoval paranoiq (16. 6. 2011 12:26)
- Filip Procházka
- Moderator | 4668
Rozhraní IHaveMyOwnErrorPresenter
(s lepším názvem
samozřejmě) mi přijde jako dobrý nápad.
- nanuqcz
- Člen | 822
Anotace jsem ještě nepoužil (teprv se chystám), ale nebude to zase moc psaní navíc, implementovat nějaké rozhraní s nějakou metodou přijímající jakýsi PresenterRequest? Ani nevím, jak přesně takový PresenterRequest vypadá :-)
Neměl by být programátor odstíněn od toho, jak framework vevnitř
funguje? Co třeba jednoduché
@User(loggedIn, redirectOnFail=admin:sign:in)
?
Editoval xxxObiWan (16. 6. 2011 13:20)
- Jan Tvrdík
- Nette guru | 2595
Ideální je přesměrovat na někde stanovený presenter:action a
jako parametr předat $backlink
z
$this->getApplication()->storeRequest()
. Používáme to tak
už dlouho a zatím jsme nenarazili na problém.
Asi bych tu cílovou destinaci uchovával ve vlastnosti
Presenteru
. Nějaký handler nebo událost jsme nikdy
nepotřebovali.
- Jan Tvrdík
- Nette guru | 2595
xxxObiWan wrote:
Co třeba jednoduché
@User(loggedIn, redirectOnFail=admin:sign:in)
?
Ta anotace bude v aplikaci na rozličných místech. Opakovat pořád stejnou destinaci mě rozhodně brzo přestane bavit.
- newPOPE
- Člen | 648
Ako uzivatel by som bral nieco ako hovori @jan tvrdik nastavim napr. v
BasePresenteri
destinaciu kam sa pojde defaultne… No keby som pri
konkretnom presenteri/akcii napisal nieco ako pise @xxxObiWan a tym
pretazil ten BasePresenter
to by bol pre mna luxux :-)
<?php
class BasePresenter ... {
protected function startup() {
$this->getUser()->deniedAccessDestination = :blablabla; //trocha dlhy nazov :-D
//app by tam presmerovala aj s tym storeRequestom, nieco ako na ErrorPresenter
}
}
class MyPresenter ... {
/**
* @User(..., deniedAccess=....) //tu by som si to spravanie vedel pretazit
*/
public function ... () {}
}
?>
- Šaman
- Člen | 2659
A proč ne na ErrorPresenter? Má být přihlášen a není, což je chyba. Defaultně na užvatele vybafne stránka s žádostí o přihlášení, ta šablona se dá upravit, případně se z ErrorPresenteru dá redirectnout na přihlašování. To už je v kompetenci programátora. Psát do BasePresenteru kam se má uživatel přesměrovat při kdejaké chybě (nemá povolené Cookies, JS, není přihlášen, nemá práva..) mi přijde WTF.
- nanuqcz
- Člen | 822
Šaman napsal(a):
A proč ne na ErrorPresenter? Má být přihlášen a není, což je chyba. … ta šablona se dá upravit, případně se z ErrorPresenteru dá redirectnout na přihlašování. …
Teď budu mít asi začátečnický dotaz: V tom ErrorPresenteru se dá poznat, kvůli jakému typu chyby se tento presenter spustil? (NotLoggedInException nebo tak nějak) … Pokud ano, zdá se mi to jako hodně hezké řešení :-)
- Ani
- Člen | 226
Teď nevím jestli nějak funguje dědění anotací, ale když by to šlo nastavit anotací nad třídou presenteru pro celý presenter a fungovalo dědění, tak si to člověk nastaví v basepresenter. Navíc by to pak šlo pěkně přepsat pro konkrétní presenter/metodu.
Kombinace anotací a metod mi pro to přijde matoucí. To už bude lepší to všude vypisovat.
- Aurielle
- Člen | 1281
xxxObiWan: pokud si na to vytvoříš vlastního potomka Exception, tak ano.
Jinak já to mám tak, že se při neúspěšnosti autorizace se spustí pole callbacků, do kterého si v BasePresenteru registruji anonymní funkcí něco takového:
// Kontrola autorizace
private function authCheck()
{
// We don't want to check authorization in AuthPresenter or in presenters with @secured FALSE annotation
if(Nette\String::endsWith($this->name, 'Auth') || $this->reflection->getAnnotation('secured') === FALSE)
{
return;
}
// Check callbacks
if($this->onLoginNeeded === NULL)
throw new \InvalidStateException('Login callback function not set. Please set one.');
if($this->onAuthorizationFailed === NULL)
throw new \InvalidStateException('Authorization failed callback function not set. Please set one.');
// Check action & signal
if(!$this->actionCheck() || !$this->signalCheck()) {
// Login
if(!$this->user->isLoggedIn()) {
$this->onLoginNeeded($this);
return;
}
$this->onAuthorizationFailed($this);
return;
}
}
// Callback pro přihlášení
$this->onLoginNeeded[] = function($presenter) use($class) {
switch($presenter->getUser()->getLogoutReason())
{
case Nette\Web\User::INACTIVITY:
$presenter->flashMessage(__('Your session expired. Please log in again.'), $class::FLASH_INFO);
break;
case Nette\Web\User::MANUAL:
case Nette\Web\User::BROWSER_CLOSED:
case NULL:
default:
$presenter->flashMessage(__("Please login to use this feature."), $class::FLASH_LOGIN);
break;
}
$backlink = $presenter->getApplication()->storeRequest();
$presenter->redirect(301, ':Admin:Auth:login', array('backlink' => $backlink));
};
- bojovyletoun
- Člen | 667
je to pěkný, ale právě chtělo by to rozšířit kromě loggedIn na inRole a allowed