Po úspěšném přihlášení se zobrazí Spojení přerušeno (Chyba při načítání stránky)
- Jarek92
- Člen | 91
Zdravím všechny,
už dlouhou dobu řeším problém, se kterým si ale už nevím rady. Mám web
rozdělen na tři moduly (Front, Admin a Reservation). V modulu Admin mám
BasePresenter, kde řeším kontrolu přihlášení a práv do všech ostatních
presenterů v tomto modulu. Problém je, že při přihlášení se mi dlouho
načítá stránka, která ale po chvilce skončí chybou: Chyba při
načítání stránky → Spojení přerušeno – Spojení se serverem bylo
v průběhu načítání stránky ukončeno.
Ovšem pokud poté jdu na stránku, kde se nekontroluje stav přihlášení, tak se v pořádku načte a navíc v debug baru je v identitě uživatel již správně přihlášen. Když následne spustím url adresu s odhlášením, tak se mi uživatel v pořádku odhlásí. Když pak zadám nějaou url, která vyžaduje přihlášení, tak mi správně přesměruje na formulář s přihlášením. Když se pokusím přihlásit, tak mi opět naskočí stránka Spojení přerušeno. Nicméně následně v debug baru je ta identita opět přítomná.
Zde je BasePresenter (AdminModule)
namespace AdminModule;
use Nette;
abstract class BasePresenter extends Nette\Application\UI\Presenter {
public function startup() {
parent::startup();
if (!$this->getUser()->isLoggedIn()) {
$this->redirect('Sign:in');
}
if(!$this->user->isAllowed($this->getName(), $this->getAction())) {
$this->flashMessage("Nemáte oprávnění vstoupit do této sekce.", "error");
$this->redirect("Homepage:default");
}
}
}
Zde je SignPresenter (AdminModule)
namespace AdminModule;
use Nette;
class SignPresenter extends Nette\Application\UI\Presenter {
protected function createComponentSignInForm() {
$form = new Nette\Application\UI\Form;
$form->addText('username', 'Jméno:')
->setRequired('Uživatelské jméno je povinné');
$form->addPassword('password', 'Heslo:')
->setRequired('Heslo je povinné');
$form->addSubmit('send', 'Přihlásit se');
$form->onSuccess[] = $this->signInFormSucceeded;
return $form;
}
public function signInFormSucceeded($form, $values) {
try {
$this->getUser()->login($values->username, $values->password);
$this->flashMessage("OK, v pohodě.");
$this->redirect('Homepage:default');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné přihlašovací údaje!');
}
}
public function actionOut() {
$this->getUser()->logout(TRUE);
$this->flashMessage('Byl(a) jste úspěšně odhlášen(a)', 'success');
$this->redirect('in');
}
}
Stalo se Vám někdy něco podobného? Díky za všechny rady.
Editoval Jarek92 (3. 6. 2016 10:00)
- Pavel Kravčík
- Člen | 1195
Určitě vyzkoušej duplikovat chybu na localhostu s Tracy. Po smyčce je v Tracy klidně 100× adresa, kde je smyčka. Případně, pokud to není smyčku zkontroluj složku /log/, jestli není vygenerována výjimka.
- Jarek92
- Člen | 91
Smyčku při přesměrování nemám, díval jsem se do složky log, nicméně tam ohledně přihlašování nic není.
Teď mě tak napadlo, já mám na localhostu více projektů a dva z nich mají právě řešené přihlašování stejně (pomocí acl, authenticatoru atd..). Když se přihlásím na jednom webu (tak to na tom stejném funguje vše v pořádku). No a když zkusím pak se dostat do zabezpečené sekce toho druhého webu (který před tím nešel), tak ted jde. To je docela zajímavé. Nevíte, jakým způsobem se ukládají na serveru (localhostu) SESSION?
- Pavel Kravčík
- Člen | 1195
Začni krokovat. dump() + die;
Začal bych zjišťovat, kde to
skončí.
A prověřil bych toto, jestli ->login() vrací Ok.
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné přihlašovací údaje!');
}
- iguana007
- Člen | 970
Zkoušel si to simulovat i z jiného připojení? Tento problém dost
často nebývá způsobený aplikací, ale providerem internetu příp.
samotným počítačem kde se problém vyskytuje. Na internetu je spousta
vláken řešící stejný problém a ve většině případů to bylo
vyřešeno na straně ISP, příp. resetem připojení a DNSek na počitači,
kde se problém objevuje…
Jedno z těch vláken zde: http://superuser.com/…all-browsers
- Jarek92
- Člen | 91
Tak jsem zkoušel po metodě login zavolat redirect na :Front:Homepage:default a všechno v pohodě, funguje tak jak má. Zkoušel jsem také z adminu uplně oddělat přihlašování a bylo to stejné, tzn. že se na jakýkoliv presenter v adminu nemuzu dostat (Spojení přerušeno). Napadlo mě, nemá xampp (localhost, apache) nějaký ban list, tzn. že po určitém počtu vstupů přístup na danou url zablokuje?
- Jarek92
- Člen | 91
Má podoba routeru:
class RouterFactory
{
/**
* @return Nette\Application\IRouter
*/
public function createRouter() {
$router = new RouteList();
$router[] = $adminRouter = new RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $reservationRouter = new RouteList('Reservation');
$reservationRouter[] = new Route('prehled-rezervaci/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
}
- Jarek92
- Člen | 91
Ještě přikládám kód z bootstrap.php
require __DIR__ . '/../vendor/autoload.php';
$configurator = new Nette\Configurator;
$configurator->setDebugMode(TRUE); // debug mode MUST NOT be enabled on production server
$configurator->enableDebugger(__DIR__ . '/../log');
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../vendor/others')
->register();
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');
$container = $configurator->createContainer();
return $container;
// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
$router = $container->getService('router');
$router[] = new Route('index.php', 'Front:Homepage:default', Route::ONE_WAY);
$router[] = $adminRouter = new RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Homepage:default');
$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
} else {
$container->addService('router', new SimpleRouter('Front:Homepage:default'));
}
return $container;
- Jarek92
- Člen | 91
Tak konečně vyřešeno. Nakonec to zřejmě bylo bránou firewall.
V jejím nastavení se totiž povolil služby: BranchCache – klient
hostované mezipaměti (používá protokol HTTPS)
BranchCache – načtení obsahu (používá protokol HTTP)
BranchCache – server hostované mezipaměti (používá protokol HTTPS)
BranchCache – zjišťování rovnocenných zařízení (používá
rozhraní WSD)
Nicméně jsem si jist, že jsem předtím tyto služby nezakazoval. Tak nevím.