Přihlášení vždy až na druhý pokus
- Tomáš Jablonický
- Člen | 115
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
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
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ě.
- Tomáš Jablonický
- Člen | 115
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 :-)
- Tomáš Jablonický
- Člen | 115
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