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
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
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)
- redhead
- Člen | 1313
//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])