Jak na login s emailem místo username?
- TorrX
- Člen | 40
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?
- TorrX
- Člen | 40
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);
}
}
- Mysteria
- Člen | 797
@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
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
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
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
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
Nestačí mít v formu, zda se jedná o email a pokud ano, v autenticatoru zda nějaký takový řádek existuje?