Přihlášení vždy až na druhý pokus

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

Ahoj,

řeším docela zajímavý problém. Vždy když si otevřu nově prohlížeč a chci se přihlásit do aplikace, tak se přihlásím vždy na druhý pokus (login je správný). Děje se to jen při novém otevření prohlížeče, pak už vše šlape jak má. Napadlo mě, že by to mohlo být způsobené sessions ale ta funguje okamžitě bez problému.

bootrstrap

<?php

$params['libsDir'] = APP_DIR . '/../libs';
require $params['libsDir'] . '/Nette/loader.php';
require $params['libsDir'] . '/dibi/dibi.php';
require $params['libsDir'] . '/DibiTableX/DibiTableX.php';

use Nette\Diagnostics\Debugger,
    Nette\Configurator,
    Nette\Environment,
    Nette\Application\Routers\RouteList,
    Nette\Loaders\RobotLoader,
    Nette\Application\Routers\Route,
    Nette\Application\Routers\SimpleRouter;

Debugger::enable();

Environment::setVariable('tempDir', '%appDir%/../temp');
Environment::setVariable('logDir', '%appDir%/../log');

$configurator = new Configurator();
$configurator->container->params += $params;
$configurator->container->params['tempDir'] = APP_DIR . '/../temp';
$container = $configurator->loadConfig(APP_DIR . '/config.neon');

$loader = Environment::getRobotLoader();

dibi::connect($container->params['database']);

//registrujeme nove slozky
$loader->addDirectory(dirname(__FILE__).'/forms');
$loader->addDirectory(dirname(__FILE__).'/AdminModule/forms');
$loader->addDirectory(dirname(__FILE__).'/FrontModule/forms');
$loader->addDirectory(dirname(__FILE__).'/databases');
$loader->register();

//nova komponenta pro datum ve formulari
\AdminComponents\DateInput::register();

//nastaveni session
$session = Environment::getSession();

$session->setExpiration(0);
$session->setSavePath(dirname(__FILE__).'/../temp/sessions');

//nastartovani session
if($session->isStarted()) $session->start();

$application = $container->application;

Environment::getUser()->setAuthenticator(new \Models\Authenticator);


$router = $application->getRouter();

if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {
        $router[] = new Route('index.php', 'Front:Homepage:default', Route::ONE_WAY);

        $router[] = $adminRouter = new RouteList('Admin');
        $adminRouter[] = new Route('admin/<presenter>/<action>', 'Default:default');

        $router[] = $adminRouter = new RouteList('Forum');
        $adminRouter[] = new Route('forum/<presenter>/<action>', 'Default:default');

        $router[] = $frontRouter = new RouteList('Front');
        $frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
} else {
        $router[] = new SimpleRouter('Front:Homepage:default');
}



//$application->errorPresenter = 'Error';
$application->run();

?>

loginForm.php

<?php

/**
 * Komponenta formuláře pro přihlášení uživatele
 *
 * @author Tomáš Jablonický
 */

namespace Forms;

use \Nette\Application\UI\Form,
    \Nette\Environment,
    \Nette\Security\AuthenticationException;


class LoginForm extends BaseForm{

    public $redirect = 'this';

    public function __construct() {
        parent::__construct();
    }

    public function render(){
        $this->template->loginForm = $this->getComponent('loginForm');
        $this->template->setFile(dirname(__FILE__) . '/render.phtml');
        $this->template->render();
    }

    /**
     * Vytvoreni komponenty pro prihlasovaci formular
     *
     * @return \Nette\Forms\Form
     */
    protected function createComponentLoginForm(){
        $form = new Form();

        $form->addText('email_user', 'E-mail:');

        $form->addPassword('password', 'Heslo:');

        $form->addSubmit('login_submit', 'Einloggen');

        $form->onSubmit[] = callback($this, 'loginSubmitted');

        return $form;
    }

    /**
     * Zpracovani prihlasovaci formulare
     *
     * @param \Nette\Forms\Form $form
     */
    public function loginSubmitted(Form $form){
        if($form->isValid()){
            $values = $form->getValues();

            try{
                Environment::getUser()->login($values['email_user'], $values['password']);
            } catch (AuthenticationException $e) {
                $this->presenter->flashMessage($e->getMessage(), 'error');
                $this->presenter->redirect('this');
            }

            $this->presenter->redirect($this->redirect);
        }
    }
}
?>

authenticator.php

<?php

/**
 * Description of Authenticator
 *
 * @author jablon
 */

namespace Models;

use \Nette\Security\IAuthenticator,
    \Nette\Security\AuthenticationException,
    \Nette\Security\Identity;

class Authenticator extends BaseModel implements IAuthenticator{
    /**#@+ Exception error code */
    const IDENTITY_NOT_CONFIRM = 10;
    /**#@-*/


    /**
     * Performs an authentication
     *
     * @param array $credentials
     * @return Identity
     * @throws AuthenticationException
     */
    public function authenticate(array $credentials){
            $email    = strtolower($credentials[self::USERNAME]);
            $password = hash('sha256', $credentials[self::PASSWORD]);

            $userDb        = new \User();

            $row = $userDb->select('*')
                            ->where('email_user=%s', $email)
                            ->fetch();

            if (empty ($row)) {
                    throw new AuthenticationException('Email nebo heslo není platné.', self::IDENTITY_NOT_FOUND);
            } else if ($row->block_user == 1) {
                throw new AuthenticationException('Uživatel neexistuje.', self::IDENTITY_NOT_FOUND);
            } else if ($row->password_user != $password) {
                    throw new AuthenticationException('Email nebo heslo není platné.', self::IDENTITY_NOT_FOUND);
            }

            unset($row->password);

            return new Identity($row->iduser, $row->role_idrole, $row);
    }

}
?>

Já už si s tím nevím rady a ta chyba je prostě vidět.

2bfree
Člen | 248
+
0
-

Jen pro jistotu doporučuji ve firefoxu rozšíření CaheStatus promazat si cache, promazat cookies, dát reload a teprve pak se zkusit přihlásit.

Občas je to kešování potvora.

Tomáš Jablonický
Člen | 115
+
0
-

Tím to není, používám Operu a Chrome. Běží to na localu i na produkčním serveru a opravdu se tato chyba projevuje všude stejně.

JuniorJR
Člen | 181
+
0
-

A co se ti zobrazí po prvním loginu? Nějaká chyba nebo něco?

Tomáš Jablonický
Člen | 115
+
0
-

Ahoj,

tak chyba byla ve startování session.

<?php
.
.

//nastaveni session
$session = Environment::getSession();

$session->setExpiration(0);
$session->setSavePath(dirname(__FILE__).'/../temp/sessions');

//nastartovani session
if($session->isStarted()) $session->start();

.
.
?>

Všimněte si posledního řádku kde je podmínka. Po odstranění podmínky a ponechání $session->start() to už šlape. Škoda jen, že je to chyba, která ovlivnila cca 3 projekty :-)

JuniorJR
Člen | 181
+
0
-

Když už máš tu session takhle ošklivě, tak ta podmínka by měla být asi negována. Čili pokud session není ještě nastartována, tak ji nastartuj. :)

Editoval JuniorJR (3. 12. 2011 9:49)

Tomáš Jablonický
Člen | 115
+
0
-

JuniorJR napsal(a):

Když už máš tu session takhle ošklivě, tak ta podmínka by měla být asi negována. Čili pokud session není ještě nastartována, tak ji nastartuj. :)

No jo :D … logika a přepracovanost nejdou do hromady a navzájem se vylučují :D