Problemy s prihlasenim
- theo
- Člen | 57
Rozhodl jsem se napsat svuj dalsi projekt v nette, ale hned na zacatku jsem narazil na docela zvlastni problem, ktery je mozna banalni, pro me je vsak naprostou zahadou. Mam pro akci prihlaseni nasledujici kod:
<?php
...
public function loginSubmit($form) {
try {
$user = Environment::getUser();
$user->authenticate(
$form['username']->getValue(),
$form['password']->getValue()
); // authenticate()
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('Admin:default');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
} // try
} // loginSubmit()
...
?>
a v User modelu je pak toto:
<?php
...
public function authenticate(array $credentials) {
$username = strtolower($credentials[self::USERNAME]);
$password = sha1($credentials[self::PASSWORD]);
$row = dibi::query("SELECT * FROM user.users WHERE login=%s", array($username))->fetch();
if (!$row) {
throw new AuthenticationException("Uživatel '$username' nebyl nalezen.", self::IDENTITY_NOT_FOUND);
} // if
if ($row->password !== $password) {
throw new AuthenticationException("Neplatné heslo.", self::INVALID_CREDENTIAL);
} // if
unset($row->password);
return new Identity($row->username, NULL, $row);
} // authenticate()
...
?>
Tedy naprosto standardni (resp. z prikladu „vykradeny“) kod, ktery se
lisi jen tim, ze delam class AdminPresenter extends BasePresenter
(kde si v konstruktoru BasePresenteru overuju, ze je uzivatel prihlasen, a
pokud neni, a soucasne nevolam metodu pro vypis prihlasovaciho formulare, tak
jej na prihlasovaci formular presmeruju) a
class User extends Model impements IAuthenticator
, kde
v konstruktoru tridy Model, se pripojim k databazi.
Bohuzel at delam co delam, vzdy dostanu toto hlaseni:
Warning: Missing argument 2 for User::authenticate(), called in C:\Program Files\Apache Group\Apache2\htdocs\v1\libs\Nette\Web\User.php on line 97 and defined in C:\Program Files\Apache Group\Apache2\htdocs\v1\libs\Nette\Web\User.php on line 82
Notice: Undefined variable: password in C:\Program Files\Apache Group\Apache2\htdocs\v1\libs\Nette\Web\User.php on line 93
nacez se Apache (nebo PHP?) odporouci do vecnych lovist. Tusi nekdo v cem by mohl byt problem? Podotykam, ze se jedna o PHP5.2.10 na Apache 2.0, Nette verze 0.8 (revision 305). Zkousel jsem hledat na foru, ale zatim zrejme nikdo na podobnou chybu nenarazil (nebo jsem, a to je pravdepodobnejsi, „nesmirne sikovny“ :)…
- Vyki
- Člen | 388
v konfiguracnim souboru musis mit:
[common]
service.Nette-Security-IAuthenticator = MyAuthenticator
jako model pak pouzij toto:
<?php
class MyAuthenticator extends Object implements IAuthenticator
{
function authenticate(array $credentials)
{
$user = $credentials[self::USERNAME];
$pass = md5($credentials[self::PASSWORD]);
$row = dibi::fetch('SELECT * FROM users WHERE login=%s', $user);
if (!$row) {
throw new AuthenticationException('Toho cloveka neznam', self::IDENTITY_NOT_FOUND);
}
if ($row->password !== $pass) {
throw new AuthenticationException('Spatne heslo', self::INVALID_CREDENTIAL);
}
return new Identity($row->login, $row->role, $row);
}
}
?>
a obsluha v presenteru to bude vypadat takto:
<?php
...
public function formSubmitted($form)
{
$values = $form->getValues();
try {
$user = Environment::getUser();
$user->authenticate($values['login'], $values['password']);
$this->redirect('Home:List');
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
...
?>
Editoval Vyki (31. 7. 2009 11:48)
- theo
- Člen | 57
Ano, o tom, ze musi byt v konfiguracnim souboru napsano
service.Nette-Security-IAuthenticator = MyAuthenticator
vim
(vykoumal jsem to z prikladu, taky by to mohlo byt treba v tutorialu zmineno),
ale namisto MyAuthenticator
jsem tam mel User
,
v domeni, ze to bude normlane fungovat. Kdyz se to zmeni na
MyAuthenticator
, tak to funguje (jenze taky na jinem stroji, kde je
i jina verze PHP, takze je to neprukazne, uvidim vecer). Kazdopadne diky i za
ostatni, kdo na tenhle problem jeste narazi.