errorPresenter, signPresenter?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 7790
+
0
-

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
+
0
-

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
+
0
-

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:

  1. přesměrování přes rozhraní presenteru
  2. uživatelem nastavený defaultní LoginPresenter
  3. ErrorPresenter 401

Editoval paranoiq (16. 6. 2011 12:26)

Filip Procházka
Moderator | 4668
+
0
-

Rozhraní IHaveMyOwnErrorPresenter (s lepším názvem samozřejmě) mi přijde jako dobrý nápad.

nanuqcz
Člen | 822
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 | 2594
+
0
-

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
+
0
-

Š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
+
0
-

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
+
0
-

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
+
0
-

je to pěkný, ale právě chtělo by to rozšířit kromě loggedIn na inRole a allowed