Jak na login s emailem místo username?

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

Ahoj,

chtěl bych možnost loginu s emailem místo přezdívky, jenže když jak v formuláři tak v authenticatoru(z nejnovějšího nette-skeletonu) změním username na email, tak to z db nevytáhne roli. Koukal jsem na query a při přihlašování přes username to tahá id a roli, a když tma dam email tak to taha vše krom role.

V čem je problém?

Grelek
Člen | 233
+
0
-

A řešení se má vycucat z prstu? Co třeba kód nebo screenshot?

xciza
Člen | 194
+
0
-

Já to používám běžně na email. Místo přezdívky prostě dáš že to musí být email a problém vyřešen ;)

EDIT: username je jen sloupec z tabulky a je na tobě co do něho dáš.

Editoval xciza (9. 1. 2014 19:53)

TorrX
Člen | 40
+
0
-

xciza napsal(a):

Já to používám běžně na email. Místo přezdívky prostě dáš že to musí být email a problém vyřešen ;)

přesně to sem udělal a v tu chvíli to je Cannot read an undeclared column „role“.

<?php

use Nette\Security,
	Nette\Utils\Strings;


/**
 * Users authenticator.
 */
class Authenticator extends Nette\Object implements Security\IAuthenticator
{
	const
		TABLE_NAME = 'users',
		COLUMN_ID = 'id',
		COLUMN_NAME = 'email',
		COLUMN_PASSWORD = 'password',
		COLUMN_ROLE = 'role',
		PASSWORD_MAX_LENGTH = 4096;

	/** @var Nette\Database\Connection */
	private $database;


	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}


	/**
	 * Performs an authentication.
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
	public function authenticate(array $credentials)
	{
		list($email, $password) = $credentials;
		$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $email)->fetch();

		if (!$row) {
			throw new Security\AuthenticationException('The email is incorrect.', self::IDENTITY_NOT_FOUND);
		}

		if ($row[self::COLUMN_PASSWORD] !== $this->calculateHash($password)) {
			throw new Security\AuthenticationException('The password is incorrect.', self::INVALID_CREDENTIAL);
		}
		var_dump($row[self::COLUMN_ROLE]);
		exit();
		$arr = $row->toArray();
		unset($arr[self::COLUMN_PASSWORD]);
		return new Nette\Security\Identity($row[self::COLUMN_ID], $row[self::COLUMN_ROLE], $arr);
	}


	/**
	 * Computes salted password hash.
	 * @param  string
	 * @return string
	 */
		public static function calculateHash($password)
	{
		if ($password === Strings::upper($password)) { // perhaps caps lock is on
			$password = Strings::lower($password);
		}
		return '$2a$07$' . md5($password);
	}

}
Grelek
Člen | 233
+
0
-

A neměnil jsi tu tabulku users?

TorrX
Člen | 40
+
0
-

Grelek napsal(a):

A neměnil jsi tu tabulku users?

Tu jsem si sam vytvořil.

Mysteria
Člen | 797
+
0
-

@TorrX: Co ti vypíše to var_dump($row[self::COLUMN_ROLE]);?

TorrX
Člen | 40
+
0
-

Mysteria napsal(a):

@TorrX: Co ti vypíše to var_dump($row[self::COLUMN_ROLE]);?

tu tam mam jako kontrolu, při zadavani username to vypíše roli a při zadani emailem to nevypíše nic. ale pořešil jsem to jak se výše zmiňovalo.. mam sloupec username a v něm emaily.

Karel Chramosil
Člen | 114
+
0
-

Jak máš definovanou tabulku users v továrničce?

Mysteria
Člen | 797
+
0
-

@TorrX: Ale to je přece blbost, když změníš jenom název sloupečku v databázi a přepíšeš to i tady, tak to musí fungovat taky. Promazával jsi cache? Jen tak tip od boku, je možný, že Nette DB to měla zacachovaný a sloupec s názvem email vůbec netahala.

Editoval Mysteria (9. 1. 2014 20:28)

TorrX
Člen | 40
+
0
-

Mysteria napsal(a):

@TorrX: Ale to je přece blbost, když změníš jenom název sloupečku v databázi a přepíšeš to i tady, tak to musí fungovat taky. Promazával jsi cache? Jen tak tip od boku, je možný, že Nette DB to měla zacachovaný a sloupec s názvem email vůbec netahala.

všechno jsem promazával a vše co bylo jako username jsem změnil a zkoušel jsem, jediný co jde je prát jako username email.

Mysteria
Člen | 797
+
0
-

Jestli to chceš vyřešit, tak to zase uprav jak jsi to měl (tzn username ⇒ email). Pak přepiš řádek

$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $email)->fetch();

na

$row = $this->database->table(self::TABLE_NAME)->select('*')->where(self::COLUMN_NAME, $email)->fetch();
dump($row); exit;

a zkopíruj sem ten dump (ideálně celej).

honos
Člen | 109
+
0
-

Proste a jednoduse: V authorizatoru misto select('username,...') napis select('email,...') A tabulku bys mel mit jako zaklad takto:
id | username | email | password | role [ | … ]
int | string | string | string | enum(user|admin) [ | … ]

@Torrx napsal:

tu tam mam jako kontrolu, při zadavani username to vypíše roli a při zadani emailem to nevypíše nic.

nebo zkus zkopirovat SQL dotaz z DebugBaru a vykonat ho primo z admineru nebo phpmyadmin (nevim co pouzivas) a podivejse co ti to vypisuje..

MartinitCZ
Člen | 580
+
0
-

Nechci být za hnidopicha, ale tohle bys měl spíš řešit na djpw.cz. Tohle už opravdu není zčátečnický problém s Nette, ale je to problém s php, potažmo sql, samotným. ;)

>> Do koše stím.

Jan Suchánek
Člen | 404
+
0
-

Nestačí mít v formu, zda se jedná o email a pokud ano, v autenticatoru zda nějaký takový řádek existuje?

akadlec
Člen | 1326
+
0
-

@jenicek: tak hlavně záleží jak máš ten authenticator napsaný že, vše je to jen o tom správně šáhnout do DB, což očividně autor vůbec netuší jak se dělá.