Login uzivatele z databaze

tomas_straka
Člen | 32
+
0
-

Ahoj, zkousim si udelat prihlasovani uzivatel a porad mi to vyhazuje vyjimku v presenteru.

<?php

declare(strict_types=1);

namespace App\Presenters;

use Nette\Application\UI\Form;
use Nette;


final class HomepagePresenter extends Nette\Application\UI\Presenter
{
    public function createComponentSignIn(){

        $form = new Form;
        $form->addText('username', 'Uživatelské jméno:')
            ->setRequired('Prosím vyplňte své uživatelské jméno.');

        $form->addPassword('password', 'Heslo:')
            ->setRequired('Prosím vyplňte své heslo.');

        $form->addSubmit('send', 'Přihlásit');

        $form->onSuccess[] = [$this, 'signInSucceeded'];
        return $form;
    }

    public function signInSucceeded(Form $form, \stdClass $values){
        try {
            $this->getUser()->login($values->username, $values->password);
            $this->redirect('Homepage:');

        } catch (Nette\Security\AuthenticationException $e) {
            $form->addError('Nesprávné přihlašovací jméno nebo heslo.');    //tady
        }
    }
}
<?php
namespace App\Model;
use Nette;

class Authenticator implements Nette\Security\IAuthenticator
{
    private $database;
    private $passwords;

    public function __construct(Nette\Database\Context $database, Nette\Security\Passwords $passwords)
    {
        $this->database = $database;
        $this->passwords = $passwords;
    }

    public function authenticate(array $credentials): Nette\Security\IIdentity
    {
        [$username, $password] = $credentials;

        $row = $this->database->table('users')
            ->where('user', $username)
            ->fetch();
        //dumpe($row);

        if (!$row) {
            throw new Nette\Security\AuthenticationException('User not found.');
        }

        if (!$this->passwords->verify($password, $row->password)) {
            throw new Nette\Security\AuthenticationException('Invalid password.');
        }

        return new Nette\Security\Identity(
            $row->id,
            $row->role, // nebo pole více rolí
            ['name' => $row->username]
        );
    }
}
services
App\Router\RouterFactory::createRouter
App\Model\Authenticator

Co delam spatne. Diky

Václav Kraus
Člen | 77
+
0
-

Ahoj,

jak máš uložené heslo?

tomas_straka
Člen | 32
+
0
-

Ahoj, jako varchar(256) konkretne ‚123‘

tomas_straka
Člen | 32
+
0
-

tady je dump z db

Nette\Database\Table\ActiveRow
table: Nette\Database\Table\Selection
data: array
'id' => 1
'password' => '123'
dataRefreshed: false
Václav Kraus
Člen | 77
+
+3
-

Heslo v databázi nemůže být v čitelné podobě. Musíš na něj nejříve aplikovat hashovací funkce.

Koukni třeba jak funguje https://github.com/…ate-user.php

tomas_straka
Člen | 32
+
0
-

Václav Kraus napsal(a):

Heslo v databázi nemůže být v čitelné podobě. Musíš na něj nejříve aplikovat hashovací funkce.

Koukni třeba jak funguje https://github.com/…ate-user.php

Diky za radu. To jsem nevedel. Uz jede.

tomas_straka
Člen | 32
+
0
-

Ahoj, jeste prosim dotaz.
Jak predam usera do sablony? Potrebuji vypsat jmeno usera. Diky

<?php

declare(strict_types=1);

namespace App\Presenters;

use Nette\Application\UI\Form;
use Nette;
use Nette\Security\User;


final class HomepagePresenter extends Nette\Application\UI\Presenter
{

    private User $user;

    public function __construct(Nette\Security\User $user)
    {
        $this->user = $user;
    }
    public function renderDefault()
    {
        //dumpe($this->user);
        $this->template->user = $this->user;
    }

    public function createComponentSignIn(){

        $form = new Form;
        $form->addText('username', 'Uživatelské jméno:')
            ->setRequired('Prosím vyplňte své uživatelské jméno.');

        $form->addPassword('password', 'Heslo:')
            ->setRequired('Prosím vyplňte své heslo.');

        $form->addSubmit('send', 'Přihlásit');

        $form->onSuccess[] = [$this, 'signInSucceeded'];
        return $form;
    }

    public function signInSucceeded(Form $form, \stdClass $values){
        try {

            $this->getUser()->login($values->username, $values->password);
            //dumpe($this->user);
            $this->redirect('Homepage:default');

        } catch (Nette\Security\AuthenticationException $e) {
            $form->addError('Nesprávné přihlašovací jméno nebo heslo.');    //tady
        }
    }


}
{if $user->isLoggedIn()}
{control signIn}
{else}
prihlasen
{/if}
<?php
namespace App\Model;
use Nette;

class Authenticator implements Nette\Security\IAuthenticator
{
    private $database;
    private $passwords;

    public function __construct(Nette\Database\Context $database, Nette\Security\Passwords $passwords)
    {
        $this->database = $database;
        $this->passwords = $passwords;
    }

    public function authenticate(array $credentials): Nette\Security\IIdentity
    {
        [$username, $password] = $credentials;

        $row = $this->database->table('users')
            ->where('user', $username)
            ->fetch();

        if (!$row) {
            throw new Nette\Security\AuthenticationException('User not found.');
        }

        if (!$this->passwords->verify($password, $row->password)) {
            throw new Nette\Security\AuthenticationException('Invalid password.');
        }

        return new Nette\Security\Identity(
            $row->id,
           //dumpe($row->user)
            ['name' => $row->user]
        );
    }
}
lookass
Člen | 54
+
0
-

Ahoj, nijak, už tam je.
Viz. https://doc.nette.org/…n/presenters#…

V šabloně si pak vytáhneš identitu takto:
{$user->getIdentity()->name}

Ještě ale koukám, že ti to nebude fungovat, 2. argument konstruktoru Identity je roles.

return new Nette\Security\Identity(
    $row->id,
    null, // roles
    ['name' => $row->user]
);

Editoval lookass (19. 1. 2021 16:18)

tomas_straka
Člen | 32
+
0
-

lookass napsal(a):

Ahoj, nijak, už tam je.
Viz. https://doc.nette.org/…n/presenters#…

V šabloně si pak vytáhneš identitu takto:
{$user->getIdentity()->name}

Ještě ale koukám, že ti to nebude fungovat, 2. argument konstruktoru Identity je roles.

return new Nette\Security\Identity(
    $row->id,
    null, // roles
    ['name' => $row->user]
);

Ahoj, diky za reakci, ale tohle mi nefunguje {$user->getIdentity()->name}. Musim na to jit takhle {$user->getIdentity()->getRoles()[‚name‘]}
Co je spatne?
"

return new Nette\Security\Identity(
            $row->id,
            //dumpe($row->user)
            ['name' => $row->user]
        );
lookass
Člen | 54
+
+1
-

No to je tím, jak jsem psal, druhý parametr konstruktoru Identity jsou roles.

tomas_straka
Člen | 32
+
0
-

Diky, uz funguje.