Po odeslání přihlašovacího formuláře aplikace uživatele nepřihlásí
- cermakpavel
- Člen | 4
Ahoj,
Mám problém s přihlašováním uživatelů, už se s tím nějakou dobu
peru a ne ne najít chybu.
Uživatel přijde na přihlašovací stránku, vyplní údaje, ale aplikace
ho nepřihlásí.
Využívám věci ze sandboxu, přesněji UserManager, SignPresenter a
SignFormFactory.
SignPresenter
<?php
namespace App\AdminModule\Presenters;
use Nette;
use App\Forms\SignFormFactory;
class SignPresenter extends \App\BaseModule\Presenters\BasePresenter
{
/** @var SignFormFactory @inject */
public $factory;
/**
* Pokud je uživatel přihlášený, přesměrujeme ho rovnou do administrace.
*/
protected function startup() {
parent::startup();
if ($this->user->isLoggedIn() == TRUE && $this->getAction() != "out") {
$this->redirect(':Admin:Dashboard:');
}
}
/**
* Vytvoříme přihlašovací formulář a po úspěšném přihlášení uživatele přesměrujeme do administrace.
*/
protected function createComponentSignInForm()
{
$form = $this->factory->create();
$form->onSuccess[] = function ($form) {
$form->getPresenter()->redirect('Dashboard:');
};
return $form;
}
/**
* Uživatele odhlásíme a přesměrujeme na přihlašovací okno administrace.
*/
public function actionOut()
{
$this->getUser()->logout();
$this->flashMessage('Byl/a jste odhlášen/a.');
$this->redirect('in');
}
}
UserManager
<?php
namespace App\Model;
use Nette;
use Nette\Security\Passwords;
use Nette\Security as NS;
/**
* Users management.
*/
class UserManager extends Nette\Object implements NS\IAuthenticator
{
const
TABLE_NAME = 'users',
COLUMN_ID = 'id',
COLUMN_NAME = 'username',
COLUMN_PASSWORD_HASH = 'password',
COLUMN_ROLE = 'role';
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
/**
* Performs an authentication.
* @return Nette\Security\Identity
* @throws Nette\Security\AuthenticationException
*/
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->database->table('users')
->where('username', $username)->fetch();
if (!$row) {
throw new NS\AuthenticationException('User not found.');
}
if (!NS\Passwords::verify($password, $row->password)) {
throw new NS\AuthenticationException('Invalid password.');
}
return new NS\Identity($row->id, $row->role, array('username' => $row->username));
}
/**
* Adds new user.
* @param string
* @param string
* @return void
*/
public function add($username, $password)
{
try {
$this->database->table(self::TABLE_NAME)->insert(array(
self::COLUMN_NAME => $username,
self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
));
} catch (Nette\Database\UniqueConstraintViolationException $e) {
throw new DuplicateNameException;
}
}
}
class DuplicateNameException extends \Exception
{}
SignFormFactory
<?php
namespace App\Forms;
use Nette;
use Nette\Application\UI\Form;
use Nette\Security\User;
class SignFormFactory extends Nette\Object
{
/** @var FormFactory */
private $factory;
/** @var User */
private $user;
public function __construct(FormFactory $factory, User $user)
{
$this->factory = $factory;
$this->user = $user;
}
/**
* @return Form
*/
public function create()
{
$form = $this->factory->create();
$form->addText('username', 'Username:')
->setRequired('Please enter your username.');
$form->addPassword('password', 'Password:')
->setRequired('Please enter your password.');
$form->addCheckbox('remember', 'Keep me signed in');
$form->addSubmit('send', 'Sign in');
$form->onSuccess[] = array($this, 'formSucceeded');
return $form;
}
public function formSucceeded(Form $form, $values)
{
if ($values->remember) {
$this->user->setExpiration('14 days', FALSE);
} else {
$this->user->setExpiration('20 minutes', TRUE);
}
try {
$this->user->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('The username or password you entered is incorrect.');
}
}
}
- David Matějka
- Moderator | 6445
A co se stane? zobrazi to nejakou chybu?
pripadne, jak vykreslujes formular? setkal jsem se X-krat s tim, ze lidi nevykreslovali validacni chyby, takze nebylo videt, proc formular neprosel validaci
- cermakpavel
- Člen | 4
Už jsem nalezl problém, formulář jsem vypisoval pomocí
{form signInForm}{/form},
když ho vypíšu pomocí {control signInForm} vše běží jak má.
Chci se ještě zeptat, jaký je funkční rozdíl mezi {form} a {control}?
Díky
- David Matějka
- Moderator | 6445
Pomoci form makra vykreslujes manualne, pomoci control makra automaticky. vice v doc: https://doc.nette.org/cs/forms#…