Vytvorenie a overenie hash hesla
- Danndy
- Člen | 35
Zdravím.
Vytvoril som si vlastne prihlasovanie a registráciu, všetko funguje ako má
a teraz sa snažim ktomu ešte pridať hash hesla ale nedarí sa mi.
V mojom authetincatore mám funkciu ktorá sluzi na kontrolu hesla zaslaného
prihlasovacím formulárom
public static function passwordHasher($password, $salt = null)
{
if ($salt === null)
{
$salt = '$2a$07$' . Strings::random(22);
}
return crypt($password, $salt);
}
Avšak teraz neviem ako zahashovať heslo pri registrácii. chcel som
použiť túto istú funkciu ale nepodarilo sa mi injectnuť aurenticator ktorý
obsahuje funkciu do môjho RegisterPresentri.
Vedel by mi niekto poradiť ako nato?
Vopred ďakujem za odpoveď.
- Šaman
- Člen | 2666
- Injectnout authorizator do presenteru by neměl být problém, co ti na tom nefunguje? Buď inject metodou, nebo pomocí public property s anotací @inject.
- Nicméně metoda
calculateHash
do authorizatoru nepatří právě proto, že může být potřeba i jindy, než při ověřování hesla. Patří do modelu a authorizator by si ji měl jako službu vyžádat v konstruktoru.
Ten druhý bod je ale jen teoretické zamyšlení, pro začátek bude stačit zprovoznit ten inject.
P.S. Už to asi vidím – proč je ta metoda static? Tu pak musíš volat staticky a nikam neinjectovat. Ale je to fuj.
- Danndy
- Člen | 35
Šaman napsal(a):
- Injectnout authorizator do presenteru by neměl být problém, co ti na tom nefunguje? Buď inject metodou, nebo pomocí public property s anotací @inject.
Do RegisterPresenter.php som pridal:
/** @var Model\MyAuthenticator @inject */
public $auth;
a hlásy chybu: Please use a fully qualified name of class/interface in @var annotation at App\RegisterPresenter::$auth property. Class ‚App\Model\MyAuthenticator‘ cannot be found
- Nicméně metoda
calculateHash
do authorizatoru nepatří právě proto, že může být potřeba i jindy, než při ověřování hesla. Patří do modelu a authorizator by si ji měl jako službu vyžádat v konstruktoru.
skusim so si teda vytvoriť Module/PassHash.php :
<?php
namespace Model;
use Nette,
Nette\Utils\Strings;
class PassHash extends Nette\Object
{
public static function hashPassword($password, $salt = null)
{
if ($salt === null)
{
$salt = '$2y$07$' . Strings::random(22);
}
return crypt($password, $salt);
}
}
Injectol som to v RegisterPresenteri:
/** @var Model\PassHash @inject */
public $hash;
a tam to funguje, pri registrácii heslo zahashuje, ale keď injectnem PassHash v MyAuthenticatore, tak vyhodi chybu pri prihlasovaní na tomto riadku:
if ($row->heslo !== $this->hash->hashPassword($password, $row->heslo) )
a to takúto : Call to a member function hashPassword() on a non-object
- Šaman
- Člen | 2666
Danndy napsal(a):
a hlásy chybu: Please use a fully qualified name of class/interface in @var annotation at App\RegisterPresenter::$auth property. Class ‚App\Model\MyAuthenticator‘ cannot be found
Však ti to říká, co máš udělat. Vyplň v té anotaci celý namespace s lomítkem na začátku. Jinak to hledá v aktuálním NS, takže to někdy funguje, jiny ne. (Těmhle anotacím nepomáhá ani use sekce, neumí s ní pracovat, takže vždcky kompletní ns od počátečního lomítka).
- jiri.pudil
- Nette Blogger | 1032
keď injectnem PassHash v MyAuthenticatore, tak vyhodi chybu pri prihlasovaní na tomto riadku:
Mimo presentery je automatické injectování podle anotace defaultně vypnuté, závislosti bys měl ideálně předávat v konstruktoru.
- Danndy
- Člen | 35
Šaman napsal(a):
Však ti to říká, co máš udělat. Vyplň v té anotaci celý namespace s lomítkem na začátku. Jinak to hledá v aktuálním NS, takže to někdy funguje, jiny ne. (Těmhle anotacím nepomáhá ani use sekce, neumí s ní pracovat, takže vždcky kompletní ns od počátečního lomítka).
Diky.
Funguje to keď som tu anotáciu prepísal nasledovne:
/** @var MyAuthenticator @inject */
public $auth;
A vedel by si mi poradiť ako vyriešiť tu druhú chybu ktorú mi hlási keď mám spravenu zvlašt triedu z tou funkciou ?
- Šaman
- Člen | 2666
Na to ti odpověděl @jiri.pudil. Automatické injectování pomocí
property a inject metod v Nette 2.1 final je zapnuté pouze pro presentery.
Jak už jsem psal i v tom prvním příspěvku, Authorizator
by
si měl ten Model/PassHash
vyžádat v konstruktoru – je to
povinná závislost. Autowire pomocí konstruktor injection funguje pro všechny
služby.
A propo, pokud použiješ konstruktor (nebo inject metodu), tak je možné používat sekci use. Problém s ní mají pouze autowired anotace.
Editoval Šaman (14. 2. 2014 7:17)