Po odeslání přihlašovacího formuláře aplikace uživatele nepřihlásí

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

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

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

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

Pomoci form makra vykreslujes manualne, pomoci control makra automaticky. vice v doc: https://doc.nette.org/cs/forms#…