Zamezení přímého přístupu na stránku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Azathoth
Člen | 495
+
0
-

Zdravím,

hodně jsem hledal, ale buď jsem hledal špatně a nebo se tady tím opravdu nikdo nezabýval.
Mohu nějak v nette udělat omezení, aby mi uživatelé nechodili na nějakou stránku přímo, ale aby se na ni mohli dostat pouze v případě, že na ni budou přesměrováni? Například po dokončení registrace by byl uživatel přesměrován na stránku, která mu oznámí, že byl úspěšně zaregistrován, ale nechci, aby měli uživatelé možnost se na tu stránku dostat tak, že naťukají url té stránky.
Vím, že něco takového jde přes .httaccess, ale chtěl bych to mít hezky přehledně v nette, že by existoval nějaký abstract OnlyRedirectPresenter, který by to obstarával.
Děkuji za všechny rady.

David Kudera
Člen | 455
+
+1
-

No pokud je to fakt potřeba, tak bych to asi zkusil řešit přes session. Uložit si prostě nějakou proměnnou „jdu ze stránky registrace“ a na té „skryté“ stránce si existenci téhle proměnné zkontrolovat. Samozřejmě nějak šikovněji než jen tak, jak jsem to napsal :-)

A vlastně si z toho můžeš vytvořit i nějakou obalující službu.

A nebo třeba jen nějakou metodu v presenteru, která tu proměnnou před redirectem uloží a v cílové akci by se to dalo zkombinovat třeba s anotacemi a metodou checkRequirements v nějakým base presenteru.. Je to jen nápad z hlavy a třeba by se ukázalo, že je to nesmysl, ale přijde mi to zajímavý.

Jé a vlastně by to šlo ještě víc zautomatizovat. Např. si trochu nehezky uložit tu proměnnou v každé startup metodě jako název presenteru a akce.

public function startup()
{
	parent::startup();

	$session->previousPage = $this->getAction(true);
}

A pokud bych to měl přes ty anotace, tak skryté akce by mohli být třeba takhle:

/**
 * @allowFrom(":User:SignUp")
 */
public function actionSignUpSuccess()
{

}

stačilo by na to jen rozšířit metodu checkRequirements a otestovat ten zápis anotací, aby se správně rozparsoval (nejsem si jistý těma uvozovkama a taky by to mělo brát pole předchozích akcí).

Edit: jen nevýhodou by mohlo být více otevřených tabů..

Editoval David Kudera (15. 8. 2014 19:53)

Aurielle
Člen | 1281
+
0
-

Chceš něco, čemu se říká security by obscurity. Proč to neponechat veřejné a zakazovat přístup nebo přesměrovávat při nesplnění vstupních podmínek? Určitě nemáš tolik případů, kde by to bylo nutné řešit, aby bylo nutné třeba to, co navrhuje @DavidKudera…

Azathoth
Člen | 495
+
0
-

A jak například dělat ty vstupní podmínky? Jediné, co mne napadá, je plnění nějakých session proměnných…a to je přesně to, co navrhuje @DavidKudera. Nebo by to šlo nastavováním nějakých property u Identity, ale to mi pořád přijde trochu neelegantní.

Ono vlastně to přesměrování při nesplnění určitých podmínek by bylo to, co bych chtěl. Akorát jsem chtěl vědět, jestli nette má nativní podporu zjištění, jestli přišel uživatel přes redirect nebo to budu muset dělat sám přes $httpRequest->getReferer();

Editoval Azathoth (15. 8. 2014 21:00)

David Kudera
Člen | 455
+
0
-

Tak ono ani moje řešení není elegantní.. Třeba plní tu session vždy, i když to nakonec bude využito třeba jen u procenta případů. Ale i „pocitově“ (nechytejte se za hlavu prosím :-D) je to minimálně „trochu divný“.. Proto i moje první věta je: „pokud je to fakt nutný“. Nakonec ale jestli je to požadavkem, tak bych asi řekl proč ne..

Editoval David Kudera (15. 8. 2014 20:57)

MartyIX
Člen | 217
+
+3
-

A nestačil by ti forward místo redirectu? Pak bys nezveřejnil URL a tudíž by pro uživatele bylo těžké tam jím napřímo.