Problem s authentikaci v IE7 a Safari
- LeonardoCA
- Člen | 296
Marne nejakou chvili badam nad chybou v autentikaci a uz me nenapada kde mam
hledat.
Prihlaseni mi funguje bezchybne v FF, Google Chrome, Opere, IE6 testeru a
nefunguje v IE7 a Safari – kdyz zadam spatne heslo, vyskoci chybova hlaska
u formulare, ale pri spravnem hesle prihlaseni neprobehne a vyskoci opet
prazdny formular.
nastaveni cookies v prohlizeci jsem kontroloval.
Prihlasovaci formular mam definovany jako komponentu.
Potreboval bych nakopnout :)
nize jsou podstatne kousky kodu
Default presenter
<?php
protected function createComponentUc($name)
{
return new UniversalControl;
}
public function actionLogout()
{
Environment::getUser()->signOut();
$this->redirect('Main:');
}
?>
trida Users zajistujici autentikaci
<?php
class Users extends Object implements IAuthenticator
{
public $connection;
private $translator;
const USER_EXISTS = 4;
const EMAIL_CONFIRMATION = 5;
public function __construct($translator = NULL)
{
$this->connection = dibi::getConnection('accounts_db');
$this->translator = $translator;
}
public function authenticate(array $credentials)
{
$username = strtolower($credentials[self::USERNAME]);
$password = $credentials[self::PASSWORD];
$row = $this->connection->select('*')->from('USERS')->where('Email=%s', $username)->fetch();
if (!$row) {
throw new AuthenticationException("User not found", self::IDENTITY_NOT_FOUND);
}
if ($this->obscure($credentials[self::PASSWORD],$row->Psw) !== $row->Psw) {
throw new AuthenticationException("Invalid password", self::INVALID_CREDENTIAL);
}
if ($row->Authorized == 0) {
throw new AuthenticationException("Email confirmation needed", self::EMAIL_CONFIRMATION);
}
unset($row->Psw);
$this->connection->query("UPDATE `USERS` SET `LoginCount` = LoginCount+1 WHERE UserID = ".$row->UserID);
return new Identity($row->Email, NULL, $row);
}
?>
trida UniversalControl – je komponenta vykreslovana default presenterem a v ni se jeji komponenta vykresluje prihlasovaci formular
<?php
class UniversalControl extends /*Nette\Application\*/Control
{
public $translator;
public function __construct($parent = NULL, $name = NULL)
{
parent::__construct($parent,$name);
$this->translator = $parent->translator;
}
public function render()
{
$template = $this->template;
$user = Environment::getUser();
Debug::dump($user->isAuthenticated());
$template->user = $user->isAuthenticated() ? $user->getIdentity() : NULL;
$template->setFile(dirname(__FILE__) . '/UniversalControl.phtml');
$template->registerFilter(/*Nette\Templates\*/'CurlyBracketsFilter::invoke');
$template->setTranslator($this->translator);
$template->staticUri = Environment::getConfig('staticUri');
$template->render();
}
protected function createComponentForm($name)
{
$form = new AppForm($this, $name);
$form->addText('email', 'Email:',25)
->addRule(Form::FILLED, 'Enter your Email')
->addCondition(Form::FILLED)
->addRule(Form::EMAIL, 'E-mail is not valid');
$form->addPassword('psw', 'Password:',25)
->addRule(Form::FILLED, 'Enter your password');
$form->addSubmit('ok', 'Login');
$form->setTranslator($this->translator);
$form->onSubmit[] = array($this, 'loginHandler');
}
public function loginHandler(AppForm $form)
{
if ($form->isSubmitted()) {
if ($form['ok']->isSubmittedBy() && $form->isValid()) {
try {
Environment::getUser()->authenticate($form['email']->getValue(), $form['psw']->getValue());
$this->presenter->redirect('MoonBase:');
} catch (AuthenticationException $e) {
$form->addError($this->translator->translate($e->getMessage()));
}
}
}
}
}
?>
- LeonardoCA
- Člen | 296
diky, mam update, selze to pri presmerovani po uspesnem prihlaseni ve funkci loginHandler, kdyz redirect zrusim, tak to funguje.
<?php
$this->presenter->redirect('MoonBase:');
?>
netusim proc… ?
<?php
class MoonBasePresenter extends DefaultPresenter
{
protected function startup()
{
parent::startup();
// check user authentication
$user = Environment::getUser();
if (!$user->isAuthenticated()) {
if ($user->getSignOutReason() === User::INACTIVITY) {
$this->flashMessage('You have been logged out due to inactivity. Please login again.');
}
if ($this->getPresenter()->getAction() != "login")
{
// $this->redirect($this->getPresenter()->getName().':login');
}
}
}
?>
Editoval LeonardoCA (21. 3. 2009 17:17)
- Panda
- Člen | 569
phx napsal(a):
Kapku nevidim definici konstant:
self::USERNAME self::PASSWORD
Konstanty self::USERNAME
a self::PASSWORD
„dědí“ třída Users
od rozhraní
IAuthenticator
:
interface IAuthenticator
{
/**#@+ Credential key */
const USERNAME = 'username';
const PASSWORD = 'password';
/**#@-*/
// ...
}
- LeonardoCA
- Člen | 296
Tak se mi podarilo odhalit duvod. Odchytnul jsem si http hlavicky v me aplikaci a v akrabat, kde prihlaseni funguje. V http hlavicce mi chybi „Location“ – Safari a IE7 cookie bez teto polozky v http hlavicce neprijme.
Ted uz zbyva jen zjistit duvod, proc se mi Location v http headers neposila…
Editoval LeonardoCA (23. 3. 2009 17:42)
- LeonardoCA
- Člen | 296
Vyřešeno. Moje blbost.
Abych mohl testovat současně pro .com a .cz doménu, nastavil jsem si na lokálu hostname serveru na
jmenodomeny_com
jmenodomeny_cz
v bootstrap.php jsem měl pro přiřazení správné sekce config.ini jak na živém, tak testovacím serveru
define('ENVIRONMENT', Str_Replace (".", "_", $_SERVER['HTTP_HOST']));
a neuvědomil jsem si, že podtržítko není pro hostname povolený znak – toť vše, stačilo, když jsem začal používat pomlčku, ale než jsem na to přišel…, nikde jinde než při akceptování session v IE7 a Safari se to neprojevilo