problém při Autentizaci

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

Verze php 5.2.10
Verze nette 0.9

Zdravím, jsem v nette naprostý začátečník.
Mám problém při Autentizaci uživatele. Ověřuji oproti databázi login zjistí, ale u ověření hesla napíše Chyba: Invalid password.

<?php

require 'MyAuthenticator.php';
require 'Nette/loader.php';

// pokud používáte verzi pro PHP 5.3, odkomentujte následující řádek:
// use Nette\Environment, Nette\Security\AuthenticationException;

// přihlašovací údaje
$username ='tomidi';
$password ='xxx';

$user = Environment::getUser();

// zaregistrujeme autentizační handler
$user->setAuthenticationHandler(new MyAuthenticator);

// nastavíme expiraci
$user->setExpiration('+ 30 minutes');

try {
        // pokusíme se přihlásit uživatele...
        $user->authenticate($username, $password);
        // ...a v případě úspěchu presměrujeme na další stránku
        Environment::getHttpResponse()->redirect('index.php');

} catch (AuthenticationException $e) {
        echo 'Chyba: ', $e->getMessage();
}
?>

MyAuthenticator.php:

<?php

require 'dibi/dibi.php';

dibi::connect(array(
    'driver'   => 'mysql',
    'host'     => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'db',
    'charset'  => 'utf8',
));
// pokud používáte verzi pro PHP 5.3, odkomentujte následující řádek:
// use Nette\Object, Nette\Security\IAuthenticator, Nette\Security\AuthenticationException, Nette\Security\Identity;

class MyAuthenticator extends Object implements IAuthenticator
{

    public function authenticate(array $credentials)
    {
        $username = $credentials[self::USERNAME];
        $password = sha1($credentials[self::PASSWORD] . $credentials[self::USERNAME]);

        // přečteme záznam o uživateli z databáze
        $row = dibi::fetch('SELECT realname, password FROM users WHERE login=%s', $username);

        if (!$row) { // uživatel nenalezen?
            throw new AuthenticationException("Uživatel '$username' nenalezen.", self::IDENTITY_NOT_FOUND);
        }

        if ($row->password !== $password) { // hesla se neshodují?
            throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
        }

        return new Identity($row->realname); // vrátíme identitu
    }

}
?>

Může mi někdo pomoct?

redhead
Člen | 1313
+
0
-

A problém je v čem? Že píšeš správné heslo, ale ono ti píše, že je nesprávné, nebo že napíšeš schválně nesprávné a nechceš aby ti řvala červeně laděnka?

pokud 1) tak máš nejspíš blbě hashovaná ty 2 hesla (prostě hashovaná jinak)

nebo 2) si dej metodu, kterou přihlašuješ uživatele ( Enviroment::getUser()->authenticate($user, $pass) ) do bloku try/catch a odchytávej AuthenticationException, typicky takto:

public function loginFormSubmitted(Form $form)
{
	try {
		$values = $form->getValues(); //data z prihlasovaci formulare
		Enviroment::getUser()->authenticate($values['user'], $values['password']);
		$this->redirect("this");
	}
	catch(AuthenticationException $e) {
		$form->addError($e->message);
	}
}

Editoval redhead (9. 1. 2010 17:28)

tomidi
Člen | 6
+
0
-

problém bude v 1.
Můžeš mi pomoct s zahasovanim jak?

redhead
Člen | 1313
+
0
-

no při registraci uživatele musíš heshovat heslo stejně jako ho hashuješ při kontrole při authentifikaci..

čili tu sha1 funkci musíš použít i pro heslo, který vkládáš do db při registraci (v tvém případě uložit sha1(heslo+username))

tomidi
Člen | 6
+
0
-

vyborně teorie je krásná a ještě příklad prosím, něco jsem si přečetl,ale implementace??

děkuju moc

redhead
Člen | 1313
+
0
-
//registrace
public function registerUser($values)	//$values - hodnoty z formuláře
{
	$values['password'] = sha1($values['password'] . $values['login']);
	dibi::insert('users', $values);
}

//authentifikace
public function authenticate($credentials)
{
        $username = $credentials[self::USERNAME];
        $password = sha1($credentials[self::PASSWORD] . $credentials[self::USERNAME]);

	$row = dibi::fetch('SELECT realname, password FROM users WHERE login=%s', $username);
	// ...
	// ...
	if ($row->password !== $password) { // hesla se neshodují?
            throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
        }
}

//poté bude platit:
//	sha1($values['password'] . $values['login'])
//	= se rovná =
//	sha1($credentials[self::PASSWORD] . $credentials[self::USERNAME])
tomidi
Člen | 6
+
0
-

Díky moc za pomoc. Konečně jsem to pochopil.

Editoval tomidi (10. 1. 2010 12:56)