Problemy s prihlasenim

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

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

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

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.