Přesměrování z HomepagePresenteru na jiný presenter skončí chybou „Not Found – /www/index.php not found“

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

Ahoj, začínám v nette a nějak skáču od chyby k jiné, ale narazil jsem na jednu, kde si nevím rady.

Mám zkrátka v HomepagePresenter jednoduché přesměrování:

<?php
	class HomepagePresenter extends BasePresenter
	{
    	public $database;
		public function __construct(Nette\Database\Context $db){
        	$this->database = $db;
	    }

    protected function startup() {
        parent::startup();
        if ((isset($_COOKIE["_login"])) && (isset($_COOKIE["_heslo"]))){
            $this->redirect('App:RunApplication', $_COOKIE["_login"], $_COOKIE["_heslo"], $this->database);
        }
        else {
            throw new Nette\Application\BadRequestException;
        }
    }
}
?>

Přesměrování zřejmě proběhne → vygeneruje se a začne se načítat URI ve tvaru např.:
/www/app/run-application?user=test&pass=098f6bcd4621d373cade4e832627b4f6

Avšak načítání skončí klasickým httpáckým „Not Found“ → The requested URL /www/index.php was not found on this server.

Soubor index.php se v adresáři /www nachází. Oba presentery mám ve stejné složce. AppPresenter má v sobě metodu:

<?php
	public function actionRunApplication($user, $pass, $db)
    {
		...
	}
?>

Prosím o radu, co je špatně / jak postupovat / co udělat aby to jelo …

Lukeluha
Člen | 130
+
0
-

long post – přepsal jsem níže :)

Editoval Lukeluha (30. 4. 2015 21:36)

Lukeluha
Člen | 130
+
+1
-

Zaprvé – nikdy nepřistupuj přímo k superglobálním proměnným typu $_GET, $_POST, $_COOKIE, používej na to $this->getHttpRequest() – tato metoda ti vrátí objekt http request, na kterém můžeš volat tyto data, popřípadě si get parametry zaregistruj přímo jako parametr v action metodě

Zadruhé – heslo rozhodně nepředávej přímo v url, kdokoliv ho pak může vidět.

Zatřetí – instance třídy Nette\Database\Context je služba, která se dostává do presenteru pomocí Dependency injection, nepředává se mezi presentery v parametrech (navíc jak chceš objekt přenést v parametru…)! (přečti si více tady, tady a tady).

Začtvrté – edit: napsal jsem to špatně :) – název akce začíná malým písmenem – $this->redirect('App:runApplication')

Zapáte – pokud chceš pracovat s autentizací a autorizací uživatelů, s Nette to jde opravdu snadno, přečti si zde

Editoval Lukeluha (30. 4. 2015 21:41)

Mooore
Člen | 13
+
0
-

Děkuji za užitečné odpovědi. Nicméně kód jsem upravil dle svého nejlepšího vědomí. Bohužel stále hází stejnou chybu s „not found“.

<?php
	class HomepagePresenter extends BasePresenter
	{
    	private $httpRequest;

	    public function __construct(\Nette\Http\Request $request){
    	    $this->httpRequest = $request;
	    }

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

	        if (($this->httpRequest->getCookie("_login") != null) && ($this->httpRequest->getCookie("_heslo") != null)){
    	        $this->redirect('App:runApplication');
        	}
	        else {
    	        throw new Nette\Application\BadRequestException;
        	}
	    }
	}
?>

Vygenerovaná adresa je nyní /www/app/run-application

Ještě ukázka AppPresenteru:

<?php
	class AppPresenter extends BasePresenter
	{
		public function actionRunApplication()
	    {
			...
		}
	}
?>

Co se týče řešení přihlašování, vím o tom tématu. Autentifikaci řeším až na úrovni modelu.

Lukeluha
Člen | 130
+
0
-

Je dobře, že o tématu přihlašování víš, ale i tak dáváš poměrně citlivé údaje do cookie, kterou si může také kdokoliv přečíst :) tak citlivé údaje se neukládají nikam na stranu klienta.

Dále co s tou chybou mě konkrétně nenapadá. Url už se generuje správná. Pokud ti to vyhazuje chybu že přímo ten soubor index.php not found (ne že třeba Nette nenašlo šablonu k danému presenteru), tak zkontroluj htaccess a také, jestli máš povolen mod_rewrite v apache (ale to bys měl mít, protože bez toho bys nejspíš nerozjel ani úvodní stránku)

A ještě jedna věc – http request si nemusíš injektovat do presenteru, stačí zavolat $this->getHttpRequest()

Editoval Lukeluha (30. 4. 2015 22:59)

Mooore
Člen | 13
+
0
-

S tím přihlašováním nemám asi na výběr než to řešit takto. Dostal jsem webovou aplikaci, kde se uživatelé přihlašují a pak se z této aplikace můžou přesunout na mou (právě tvořenou) aplikaci, kde by měla proběhnout automatická autentifikace. Údaje o uživateli (aniž bych musel zasahovat do původní aplikace) dostanu jen přes cookies.
Zkusím teda ještě pohledat. Děkuji za rychlé reakce.

Lukeluha
Člen | 130
+
0
-

S tou cookie je to bezpečnostní díra jako prase, abych byl slušný :) navíc cookienu není problém odposlechnout a jelikož tam předáváš dokonce už hotovou hash, tak to heslo tam pomalu nemusí být žádné… Kdybys na něco přišel, tak napiš, rád poradím.