Přesměrování z HomepagePresenteru na jiný presenter skončí chybou „Not Found – /www/index.php not found“
- Mooore
- Člen | 13
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
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
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
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
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.