trida Authenticator() a vlastni tabulka uzivatele

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

Ahoj, snažím se zprovoznit přihlašování podle tohodle postupu
https://doc.nette.org/…thentication
https://pla.nette.org/…ministration

a potřebuji poradit s úpravou třídy Authenticator aby nepoužívala tabulku users, ale tabulku uzivatele se sloupečky login a pass

/app/models/Authenticator.php sem zatim upravil takto

class Authenticator extends Nette\Object implements NS\IAuthenticator
{
	private $users;

	public function __construct(Nette\Database\Table\Selection $users)
	{
		$this->users = $users;
	}

	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		$row = $this->uzivatele->where('login', $username)->fetch();

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

		if ($row->pass !== $this->calculateHash($password)) {
			throw new NS\AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
		}

		unset($row->pass);
		#return new NS\Identity($row->id, $row->role, $row->toArray());
                return new NS\Identity($row->id, NULL, $row->toArray());
	}

	public function calculateHash($password)
	{
		#return md5($password . str_repeat('*enter any random salt here*', 10));
                return hash('sha512', $password);
	}

}

pokuď dám CTRL+A, CTRL+H users na uzivatele tak mi to hodí "chybu ":http://2imgs.com/594df2d80b
takže, sem znejistěl jestli je správně

$row = $this->uzivatele->where('login', $username)->fetch();

ale pokuď ne, tak kde se definuje do jaké tabulky se to má dotazovat ?

v config.neon mám zakomentované:

#		database:
#			default:
#				dsn: '%database.driver%:host=%database.host%;database=%database.database%'
#				user: %database.username%
#				password: %database.password%

protože používám dibi, děkuji.. jinak login form se mi zobrazuje a háže to chybu při stisku tlačítka přihlásit

edit:
v návodu je také napsáno, že se má do Bootstrap.php vložit

if ($container->session->exists()) {
    $container->session->setExpiration('+15 days');
    $container->session->start();
}

ale, pak mi laděnka vyhazuje chybu, že sessions už běží

Unable to set 'session.gc_maxlifetime' to value '1296000' when session has been started by session.auto_start or session_start()

tak sem to zakomentoval, snad to nevadí.

Editoval muflix (8. 2. 2012 21:45)

Ivorius
Nette Blogger | 119
+
0
-

Cpeš konstruktoru instanci dibi namísto Nette\Database

Zkus do config.neon vložit něco jako

	services:
		database: @Nette\Database\Connection
		model: Model( @database )
		authenticator:
			class: Tvůj\Authenticator
			arguments: [@database::table(users), %security.salt%]

Pro nastavení délky platnosti session můžeš využít opět nastavení v config.neon

	nette:
		session:
			autoStart: smart
			expiration: +30 days

S nette teprve také začínám, tak doufám, že jsem ti neporadil něco blbě :D

Editoval Ivorius (9. 2. 2012 7:00)

muflix
Člen | 92
+
0
-

Ahoj, díky, ale ta řádka

function __construct(Nette\Database\Connection $connection)

je z quickstartu takže tam by problém být neměl, i v té třídě se Dibi používá, a mam to tak v celém projektu.. spíš bych potřeboval poradit kde se nastavuje/definuje do jaké tabulky se posílá ověřovací select.. jinak s tim session na to se mrknu to vypadá líp

Aurielle
Člen | 1281
+
0
-

dibi NENÍ Nette\Database. Čti.

muflix
Člen | 92
+
0
-

já vim, řikam, že v celém projektu POUŽÍVÁM DIBI, tak nechápu teď..

22
Člen | 1478
+
0
-

hm, ale předáváš Database.. :-)

function __construct(Nette\Database\Connection $connection)

měl by jsi tedy předávat:

function __construct(DibiConnection $connection)
muflix
Člen | 92
+
0
-

Ajo, tak teď se cítim trochu hloupe :D dík..
zkusil sem to tedy, přepsat
/app/models/Authenticator.php

class Authenticator extends Nette\Object implements NS\IAuthenticator
{
	/** @var Nette\Database\Table\Selection */
	private $db;

public function __construct(DibiConnection $connection){
	$this->db = $connection;
}

public function authenticate(array $credentials)
{
	list($username, $password) = $credentials;
        $row = $this->db->fetchSingle("SELECT * FROM uzivatele WHERE login='$username'");

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

	if ($row->pass !== $this->calculateHash($password)) {
	throw new NS\AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
	}

	unset($row->pass);
	#return new NS\Identity($row->id, $row->role, $row->toArray());
        return new NS\Identity($row->id, NULL, $row->toArray());
	}

nejsem si jistej, těma selectama, aby mi to vždy správně aplikovalo tu vyjímku (špatné jméno nebo heslo) a možná bych potřeboval vědět k čemu je self::IDENTITY_NOT_FOUND a self::INVALID_CREDENTIAL, protože když bych chtěl udělat jen jednu vyjímku špatné přihlašovací údaje tak čím to nahradit..

nicméně teď mi to hází chybu a asi se mu nelíbí to $row->pass.. ale ta podmínka na login funguje, napíše to uživatel not found.. jak to mohu ještě upravit ? děkuji

Editoval muflix (9. 2. 2012 21:42)

Etch
Člen | 403
+
0
-

muflix napsal(a):

nejsem si jistej, těma selectama, aby mi to vždy správně aplikovalo tu vyjímku (špatné jméno nebo heslo) a možná bych potřeboval vědět k čemu je self::IDENTITY_NOT_FOUND a self::INVALID_CREDENTIAL, protože když bych chtěl udělat jen jednu vyjímku špatné přihlašovací údaje tak čím to nahradit..

Kód výjimky je nepovinný parametr, takže tam teoreticky nemusíš dávat vůbec nic.

nicméně teď mi to hází chybu a asi se mu nelíbí to $row->pass.. ale ta podmínka na login funguje, napíše to uživatel not found.. jak to mohu ještě upravit ? děkuji

Protože tam máš fetchSingle() a tahle metoda vrací přímo hodnotu prvního pole nebo popřípadě false.

$row = $this->db->fetchSingle("SELECT * FROM uzivatele WHERE login='$username'");

změň na:

$row = $this->db->fetch("SELECT * FROM uzivatele WHERE login='$username'");
muflix
Člen | 92
+
0
-

supr už to funguje parádně moc dik :)

Filip Procházka
Moderator | 4668
+
0
-

Ještě drobnost, pokud používáš dibi, nikde v tvém kódu by se nemělo objevit Nette\Database\Table\Selection.