trida Authenticator() a vlastni tabulka uzivatele
- muflix
- Člen | 92
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
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
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
- muflix
- Člen | 92
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
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'");
- Filip Procházka
- Moderator | 4668
Ještě drobnost, pokud používáš dibi, nikde v tvém kódu by se nemělo
objevit Nette\Database\Table\Selection
.