Problém při vyplnění špatného hesla Nette\Security\AuthenticationException #2

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
KillPrd
Začátečník | 110
+
0
-

Ahoj používám funkci autentizece ze sanboxu a při přechodu na novou verzy nette pro PHP 5.3 tedy poslední co je mi to hází chybku při vyplnění špatného hesla. Heslo nemám zaheševané ale mám ho šifrované pomoci MD5. A hází mi to chybku

<?php
Nette\Security\AuthenticationException #2
?>

a odkazuje se na tento řádek

<?php
throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);
?>

Bohužel jsem nikde nevyčetl jak postupovat pro odstranění chybky…

Editoval KillPrd (19. 7. 2011 9:46)

Jan Voráček
Člen | 90
+
0
-

Čau. Jestli jsi dřív používal k zahashování hesla pouze funkci md5() (ano, md5 je hash) a nyní používáš metodu calculateHash() z Authenticatoru, musíš buď odstranit sůl, nebo zachovat konzistenci hashů nějak jinak.

Pokud bys chtěl sůl používat, což ti doporučuji, dej vědět a budeme se bavit dál.

KillPrd
Začátečník | 110
+
0
-

Tak abych se přiznal asi ti dost nerozumím co myslíš tou solí :)
jinak zpracování mám takto:

<?php

if ($row->password !== md5($password)) {
			throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);

		}

?>

tedy co bych měl odstranit? sůl co to je :)

Ascaria
Člen | 187
+
0
-

sůl je string ktery ma za ukol měnit hash hesla.. kdybys měl heslo například „ahoj“ a jeho md5 by byl „789asd“, bude takovy uplne vzdy, coz je slabina. kdyz k nemu ale pridas sul, napriklad „ahojXxXxXxX“ tak bude hash uplne jiny, treba „456qwe“ a pritom heslo bude uplne stejne. akorad pri ukladani a overovani hesla k nemu musis tu sul vzdy pridavat v phpcku

KillPrd
Začátečník | 110
+
0
-

zda dobře chápu melo by to být takto

<?php
public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		$row = dibi::fetch('SELECT * FROM admin WHERE username=%s', $username);

		if (!$row) {
			throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
		}

		if ($row->password !== $this->calculateHash($password)) {
			throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);

		}

		unset($row->password);
		return new NS\Identity($row->id, $row->prava, $row->toArray());
	}




	public function calculateHash($password)
	{
		return md5($password . str_repeat(rand(1,10), 10));
	}
?>

Ale stále mi to neřeší můj problém…

Editoval KillPrd (19. 7. 2011 15:01)

Jan Voráček
Člen | 90
+
0
-

Ne, pokud sis hesla uložil v md5 a chceš co nejjednodušší řešení, má to být takto:

<?php
public function authenticate(array $credentials)
        {
                list($username, $password) = $credentials;
                $row = dibi::fetch('SELECT * FROM admin WHERE username=%s', $username);

                if (!$row) {
                        throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
                }

                if ($row->password !== $this->calculateHash($password)) {
                        throw new NS\AuthenticationException("Špatné heslo.", self::INVALID_CREDENTIAL);

                }

                unset($row->password);
                return new NS\Identity($row->id, $row->prava, $row->toArray());
        }




        public function calculateHash($password)
        {
                return md5($password); // bez soli = hash čistého hesla
        }
?>
KillPrd
Začátečník | 110
+
0
-

Jo tak jsem to měl také ale stále tu je problém že při špatném hesle mi to vyhodí chybovou hlášku
Nette\Security\AuthenticationException #2
a toho se nemohu zbavit…

Přece při chybovém hlesle by to mělo přesměrovat a hodit hlášku zadali jste špatné heslo…

Editoval KillPrd (19. 7. 2011 18:18)

Jan Endel
Člen | 1016
+
0
-
try{
	//tady vleze jen ten co je prihlaseny
}
catch(AuthenticationException $e){
	$this->flashmessage("Chyba pri prihlasovani: $e->message");
	$this->redirect('Homepage:');
}

a co takhle ?

Editoval pilec (19. 7. 2011 19:32)

Jan Voráček
Člen | 90
+
0
-

Aha :) Přehlédl jsem, že tvá „chyba“ je správně fungující kód. Chybu sis zanesl v přihlašovacím formuláři. Mrkni do čistého sandboxu (do SignPresenteru na signInFormSubmitted), jak je to vyřešené – je to přesně, jak uvádí pilec.

Editoval Jan Voráček (19. 7. 2011 19:48)

KillPrd
Začátečník | 110
+
0
-

Tak problém byl v zápisu proměnné $values
pokud jsem měl takto zapsáno nefungovalo to: <?php $values[‚remember‘]?>
Pokud jsme to mám takto: <?php $values->remember?> tak to funguje!

Děkuji moc tohle by mě nenapadlo hlavně člověk když už neví kudy kam ta se musí vrátit na začátek že :)