Login uzivatele z databaze
- tomas_straka
- Člen | 32
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
- tomas_straka
- Člen | 32
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
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
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
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
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
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]
);