Obnovenie hesla a porovnanie užívateľa s databázou
- SontoEremo
- Člen | 341
Zdravím …
Rád by som sa Vás opýtal ako riešite obnovu hesla…
Viem, že to má byť token s url zaslaný na email a keď ho užívateľ
odklikne prsmeruje ho to na stránku s formulárom kde sa vytvorí nové heslo
a následne sa DB aktualizuej atď… to viem.
Len chcem vedieť ako si overujete užívateľa či je v db uložený ako porovnávate či zadal správny username?
Ja používam na prihlásenie email ktorý je UNIQUE ale ani za boha neviem ako to porovnať čo píše užívateľ a či sedí email.
Môj UserManager
public function matchEmail($email) {
return $this->database->table(self::TABLE_NAME)->select(self::COLUMN_ID)->where(self::COLUMN_EMAIL, $email)->fetch();
}
a Môj ResetFormFactory
$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
$values = $form->getValues();
$matchMail = $this->userManager->matchEmail($email);
if ($values->email == $matchMail) {
$form->addError('Tento Email Existuje');
return;
} else {
$form->addError('Tento Email NeExistuje');
return;
}
$onSuccess();
};
return $form;
No stále bez úspechu…
- SontoEremo
- Člen | 341
JZechy napsal(a):
Protože v matchEmail si dle názvu konstanty vyselektuješ ID, které pak porovnáváš s emailem, což logicky nikdy není true.
Ale skúšal som to aj bez toho ID výsledok stále rovnaký
public function matchEmail($email) {
return $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
}
- SontoEremo
- Člen | 341
David Matějka napsal(a):
koukni se na tu promennou
dumpol som to ale neviem prísť na to
- Mysteria
- Člen | 797
Neměl by jsi mít místo
if ($values->email == $matchMail) {
spíše
if ($matchMail !== FALSE && $values->email === $matchMail->email) {
? Protože ta metoda matchEmail ti vrací celej řádek databáze a s tím ty porovnáváš ten email z formuláře.
Editoval Mysteria (10. 1. 2017 10:58)
- SontoEremo
- Člen | 341
Mysteria napsal(a):
Neměl by jsi mít místo
if ($values->email == $matchMail) {
spíše
if ($matchMail !== FALSE && $values->email === $matchMail->email) {
? Protože ta metoda matchEmail ti vrací celej řádek databáze a s tím ty porovnáváš ten email z formuláře.
Ďakujem ale to môj problém stále nerieši viem že chyba je
public function matchEmail($email) {
return $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
}
Tu ale kde to neviem.
- SontoEremo
- Člen | 341
David Matějka napsal(a):
co je teda v
Ak dám dump
public function matchEmail($email) {
$test = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_EMAIL, $email)->fetch();
dump($test);
}
Vyhodí to len FALSE nič viac
- SontoEremo
- Člen | 341
Mysteria napsal(a):
To znamená, že tam není žádný řádek s daným emailem. Dej dump($email), ať vidíš, co to je za email, jestli je správnej a podobně.
Nette\Utils\ArrayHash #29b3
email => "moj-email@domena.xx" (24)
Aký email zadám taký mi dump vyhodí
Editoval SontoEremo (10. 1. 2017 11:45)
- Mysteria
- Člen | 797
Počkat, jestli to dobře chápu, tak když si uživatel zažádá o změnu hesla, tak on vyplní email, na který mu přijde URL adresa s nějakým tokenem. On klikne na tu URL a tam má zadat znova svůj email a nové heslo a pokud vyplnil správný email, tak mu to heslo změníš? Pokud sem to pochopil dobře a chceš aby to fungovalo takhle, tak to se mi zdá jako blbost, protože tam vlastně nikde nepracuješ s tím tokenem.
Řeknu ti, jak to řeším já. Mám klasicky tabulku user (id, username, password, email) a forgotten_password (id, user_id, timestamp, token). Uživatel klikne na odkaz, vyplní svůj email a pokud email existuje v tabulce user, tak do forgotten_password hodím nový řádek s odkazem na daného uživatele, vygenerovaným tokenem a aktuálním časem. Pošlu email, kde je odkaz, který obsahuje token. Zkontroluje se, zda je token platný (tzn. je v tabulce forgotten_password a není starší třeba než 2 hodiny). Pokud ano, tak zobrazím políčko na zadání nového hesla, on ho zadá a změním heslo uživateli, se kterým byl asociován ten token. Případně, kdyby jsi trval i na zadání emailu, tak to bude podobné. Platnost tokenu ověříš stejně, ale před samotnou změnou hesla si ještě zkontroluješ, jestli uživatel zadal email, který je stejný jako uživatele, který je asociován s tím tokenem.
- SontoEremo
- Člen | 341
@Mysteria
Počkat, jestli to dobře chápu, tak když si uživatel zažádá o změnu hesla, tak on vyplní email, na který mu přijde URL adresa s nějakým tokenem. On klikne na tu URL a tam má zadat znova svůj email a nové heslo a pokud vyplnil správný email, tak mu to heslo změníš? Pokud sem to pochopil dobře a chceš aby to fungovalo takhle, tak to se mi zdá jako blbost, protože tam vlastně nikde nepracuješ s tím tokenem.
Nie email zadá len pre overenie či je to ten užívateľ a či je v db
jeho email. Pošlem mu email s tokenom.
Presmerujem ho cez odkaz v emaily na formulár s novým heslo kde si ho môže
zmeniť.
Mám klasicky tabulku user (id, username, password, email) a forgotten_password (id, user_id, timestamp, token).
Tá tabuľka forgotten_password musí obsahovať FOREIGN KEY? teda ten user_id musí byť FOREIGN KEY?
- David Matějka
- Moderator | 6445
@SontoEremo ty to furt nevidis? v te promenne $email
nemas retezec s tim emailem, ale objekt, jehoz jedna hodnota je email
- SontoEremo
- Člen | 341
David Matějka napsal(a):
@SontoEremo ty to furt nevidis? v te promenne
Prepáč ale fakt už neviem
- SontoEremo
- Člen | 341
Skúsil som to teda takto
public function matchEmail($email) {
return $this->database->table(self::TABLE_NAME)
->where(self::COLUMN_EMAIL, ['email' => $email])
->fetch();
}
if ($values->email == $matchMail->email) {
$form->addError('Tento Email Existuje');
return;
} else {
$form->addError('Tento Email NeExistuje');
return;
}
$onSuccess();
A napodiv to overuje len či to je správne
- David Matějka
- Moderator | 6445
$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
$values = $form->getValues();
ten $email
– tam se ti nepreda email, ale hodnoty
z formulare. tedy to, co je i v $form->getValues()
na dalsim
radku. k emailu se dostanes pres $values->email
- SontoEremo
- Člen | 341
David Matějka napsal(a):
$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) { $values = $form->getValues();
ten
$form->getValues()
na dalsim radku. k emailu se dostanes pres$values->email
Prepáč ale teraz fakt nerozumiem veď tam ten values->email uvádzam
- David Matějka
- Moderator | 6445
$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {
//ve $values je to stejne jako v $form->getValues()
uz nevim, jak to lepe rict…
- SontoEremo
- Člen | 341
David Matějka napsal(a):
$form->onSuccess[] = function (Form $form, $values) use ($onSuccess) { //ve $values je to stejne jako v $form->getValues()
uz nevim, jak to lepe rict…
ale však som to tak aj mal
$form->onSuccess[] = function (Form $form, $email) use ($onSuccess) {
$values = $form->getValues();
- David Matějka
- Moderator | 6445
ale tam se NEPREDAVA email, tak se predavaji objekt s hodnotami
z formulare. Ten stejny objekt, jako ziskas pres
$form->getValues()
. Takze kdyz tento objekt pak posilas do
metody matchEmail, ktera ocekava, ze tam bude retezec s emailem, tak to nemuze
fungovat.
- SontoEremo
- Člen | 341
@DavidMatějka
Ďakujem už som to pochopil :)
@CZechBoY :) stačila 2 hod. pauza :)