Po úspěšném přihlášení se zobrazí Spojení přerušeno (Chyba při načítání stránky)

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

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

Stalo, když tam byla nekonečná smyčka přesměrování. :)

Jarek92
Člen | 91
+
0
-

No to mě se také už párkrát stalo, nicméně v tomto kódu žádnou smyčku nevidím. Přehlédl jsem ji? :)

Pavel Kravčík
Člen | 1180
+
0
-

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

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

Tohle vlákno by mělo pomoci: https://forum.nette.org/…asen-na-obou

Jarek92
Člen | 91
+
0
-

Díky moc, ale bohužel nepomohlo. Nastavil jsem v configu každému projektu svůj nameSpace a nemožnost dostat se po přihlášení do admin sekce trvás stále. Přitom na tom druhém to funguje a je to víceméně stejný zdroják. Ach jo.

Pavel Kravčík
Člen | 1180
+
0
-

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

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

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

@iguana007 Zkoušel jsem to zprovoznit na svém notebooku, ale výsledek stejný. Zkusím ještě restartovat modem s routerem.

iguana007
Člen | 970
+
0
-

Ukaž jak máš definovaný router, je divné, že ti to dělá jen v admin modulu…

Jarek92
Člen | 91
+
0
-

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

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

A také ještě dodám, že ten admin modul mi normálně fungoval, pak jsem v jednom z presenterů upravoval zdroják (validace formuláře) a pak mi po jednom refreshi stránky naskočila tato chyba a pak už se nešlo dostat do celého adminu.

Jarek92
Člen | 91
+
0
-

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.

Jarek92
Člen | 91
+
0
-

Tak problém stále přetrvává. Párkrát se modul admin načetl správně, nicméně po chvilce se už do něho zase nedostanu.