Vytvorenie a overenie hash hesla

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

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
+
0
-
  1. 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.
  2. 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
+
0
-

Šaman napsal(a):

  1. 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

  1. 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
+
0
-

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
+
0
-

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
+
0
-

Š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
+
0
-

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)

Danndy
Člen | 35
+
0
-

Moc krát ďakujem za rady! Takže toto už funguje:

public $hash;

  function __construct(Nette\Database\Context $database,Model\PassHash $hash)
  {
      $this->database = $database;
      $this->hash = $hash;
  }