Chybný Authenticator, chyba

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

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)

David Matějka
Moderator | 6445
+
+1
-

Ta metoda getBy ma jen jeden parametr, ale ty tam posilas 2

Tyraxor
Člen | 31
+
+1
-

Ahoj, máš tam drobnou chybu v předávání parametrů

$row = $this->uzivatele->getBy('username', $username);

přepiš na toto:

$row = $this->uzivatele->getBy(array('username' => $username));
pata.kusik111
Člen | 78
+
0
-

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ů.

Tymikes
Člen | 63
+
0
-

Nojo :) Díky chlapi :) mě nedošlo, že chce jen jeden parametr.