Chybný Authenticator, chyba
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Tymikes
- Člen | 63
Zdravím, upravoval jsem UserManagera, aby bral uživatele z Repozitáře a jen jsem odstranil jsem konstanty a místo nich dosadil normální hodnoty z tabulek ve stringu.
dump($row) mi pokaždé vrací prvního uživatele a nevím proč.
Pokud to propojím přímo s databází – vrací správně:
$row = $this->database->table('users')->where('username', $username)->fetch();
Pokud to tahám přes repozitář, tak je to špatně, přitom je to to samé:
$row = $this->uzivatele->getBy('username', $username);
MyAuthenticator
<?php
namespace App\Model;
use Nette;
use Nette\Security\Passwords;
use App\Model;
/**
* Users management.
*/
class MyAuthenticator extends Nette\Object implements Nette\Security\IAuthenticator
{
private $uzivatele;
public function __construct(Model\UzivatelRepozitar $uzivatele)
{
$this->uzivatele = $uzivatele;
}
/**
* Performs an authentication.
* @return Nette\Security\Identity
* @throws Nette\Security\AuthenticationException
*/
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->uzivatele->getBy('username', $username);
if (!$row) {
throw new Nette\Security\AuthenticationException('Nesprávné uživatelské jméno.', self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row['password'])) {
throw new Nette\Security\AuthenticationException('Nesprávné heslo.', self::INVALID_CREDENTIAL);
} elseif (Passwords::needsRehash($row['password'])) {
$row->update(array(
'password' => Passwords::hash($password),
));
}
$arr = $row->toArray();
unset($arr['password']);
return new Nette\Security\Identity($row['id'], $row['role'], $arr);
}
/**
* Adds new user.
* @param string
* @param string
* @return void
*/
public function pridat($username, $password)
{
try {
$this->uzivatele->insert(array(
'username' => $username,
'password' => Passwords::hash($password),
'role' => "registered"
));
} catch (Nette\Database\UniqueConstraintViolationException $e) {
throw new DuplicateNameException;
}
}
public function getUserName($uzivatel)
{
return $this->uzivatele->getBy(array('username' => $uzivatel));
}
public function getTable()
{
return $this->uzivatele->findAll();
}
}
class DuplicateNameException extends \Exception
{}
Uživatel Repozitář
<?php
namespace App\Model;
/**
* Repozitář pro práci s tabulkou 'ukoly'
*/
class UzivatelRepozitar extends Repozitar
{
protected $table = 'users';
}
Repozitář
<?php
namespace App\Model;
use Nette\Object;
use Nette\Database\Context as NDatabase;
/**
* Abstraktní repozitář.
*/
abstract class Repozitar extends Object
{
/** @var NDatabase */
protected $database;
/** @var string */
protected $table;
public function __construct(NDatabase $database)
{
$this->database = $database;
}
/**
* Vrátí všechny platné záznamy
*
* @return \Nette\Database\Table\Selection
*/
public function findAll()
{
return $this->database->table($this->table);
}
/**
* Vrátí kolekci záznamů podle podmínky
*
* @param array
* @return \Nette\Database\Table\Selection
*/
public function findBy($where)
{
return $this->findAll()->where($where);
}
/** @return Nette\Database\Table\ActiveRow */
public function findById($id)
{
return $this->findAll()->get($id);
}
/**
* Vrátí záznam podle primárního klíče
*
* @param int
* @return \Nette\Database\Table\ActiveRow|FALSE
*/
public function get($id)
{
return $this->findAll()->get($id);
}
/**
* Vrátí jeden záznam podle podmínky
*
* @param array
* @return \Nette\Database\Table\ActiveRow|FALSE
*/
public function getBy($where)
{
return $this->findAll()->where($where)->fetch();
}
/**
* Vloží nový záznam do tabulky
*
* @param array
* @return \Nette\Database\Table\IRow|int
*/
public function insert($data)
{
return $this->database->table($this->table)->insert($data);
}
public function deleteRow($id)
{
return $this->findById($id)->delete();
}
/**
* Vrátí maximální hodnotu
*
* @param int
* @return \Nette\Database\Table\ActiveRow|FALSE
*/
public function findMax($values)
{
return $this->findAll()->max($values);
}
}
Editoval Tymikes (22. 3. 2016 11:12)
- pata.kusik111
- Člen | 78
Není to to samé.
$row = $this->database->table('users')->where('username', $username)->fetch();
metoda „Where“ má 2 parametry: 'username'
a
$username
$row = $this->uzivatele->getBy('username', $username);
Sice voláš opět se 2 parametry, ale definice metody má pouze jeden (typ Array). Pokud bys měl nastavený striktní mód v PHP, tak by ti to i mělo hlásit, že ti nesedí počet parametrů.