Pomoc s registráciou a prihlasovaním

- Sonya
 - Člen | 2
 
Ahojte,
rada by som Vás poprosila o pomoc, nefunguje mi prihlasovanie/registrácia
a už si neviem rady.
V prípade prihlasovania mi vypisuje, že mám spatne heslo (aj ked vidim, ze
v DB je spravne) a pri registrácií mi vypisuje chybu .. " Class
‚App\Model\HomePageModel‘ not found ", pritom HomePageModel tam je v tom
priecinku.
- mam zmazany cache, a password v db nastavene na char(96).
 
HomePagePresenter.php
<?php
namespace App\Presenters;
use Nette;
use App\Model;
use App\Forms;
use Nette\Application\UI\Form;
class HomepagePresenter extends BasePresenter
{
    private $database;
    private $model;
    public $invisible;
    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }
    private function getModel()
    {
        if (!isset($this->model)) {
            $this->model = new \App\Model\HomePageModel($this->context->getService("database"));
        }
        return $this->model;
    }
    public function beforeRender()
    {
        parent::beforeRender();
        $this->template->_form = $this['signInForm'];
        if ($this->user->isLoggedIn() && $this->user->getIdentity()->type_user == "member") {
            $this->redirect("Panel:default");
        } elseif
        ($this->user->isLoggedIn() && $this->user->getIdentity()->type_user == "admin") {
            $this->redirect("Admin:panel");
        }
    }
    public function renderDefault()
    {
        $this->template->anyVariable = 'any value';
    }
        protected
        function createComponentSignInForm($name)
        {
            $form = new Form;
            $this[$name] = $form;
            $form->getElementPrototype()->class = "loginForm";
            $form->addText("username", "Login:")
                ->setAttribute("placeholder", "Login")
                ->setAttribute("onchange", "showPasswordInput()")
                ->setAttribute("class", "fadeInDown animated");
            $form->addPassword("password", "Password")
                ->setAttribute("placeholder", "Password")
                ->setRequired("Prosím napište svoje heslo.")
                ->setAttribute("class", "fadeInDown animated tohide");
            $form->addCheckbox("remember")->setDefaultValue(false);
            $form->addSubmit("send", "Login")
                ->setAttribute("class", "btn btn-outline btn-lg fadeInDown animated tohide");
            $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("30 minutes", TRUE);
            }
            try {
                $this->user->login($values->username, $values->password);
                $this->flashMessage("Byli jste úspešně přihlášen.");
                $form->getPresenter()->redirect("Subject:");
            } catch (Nette\Security\AuthenticationException $e) {
                $form->addError($e->getMessage());
                $this->flashMessage($e->getMessage(), "danger");
            }
        }
        public
        function actionLogout()
        {
            $this->getUser()->logout();
            $this->flashMessage('Byli jste odhlásen.');
            $this->redirect('Homepage:');
        }
        protected
        function createComponentRegisterUserForm()
        {
            $form = new Form;
            $form->getElementPrototype()->class = "registerform";
            $form->addHidden("code", $this->invisible);
            $form->addText('username', 'Pick a username:')
                ->setRequired('Please pick a username.');
            $form->addPassword('password', 'Create a password:')
                ->setRequired('Please create a password.');
            $form->addSubmit('send', 'Sign up');
            $form->onSuccess[] = array($this, 'formRegisterSucceeded');
            return $form;
        }
        public
        function formRegisterSucceeded(Form $form, $values)
        {
            $valid = $this->getModel()->registerUser($this->invisible);
            if (!empty($valid)) {
                $valid["login"] = ($valid["login"]);
                $valid["password"] = sha1($values["password"]);
                $valid["type_user"] = "member";
                $id = $valid['id_user'];
                unset($valid['id_user']);
                unset($valid['invitation_code']);
                $this->database->table('user')->insert($valid);
                $this->flashMessage('Your account was created.');
            } else {
                $this->flashMessage('A problem occurred, please try again!');
            }
            $this->redirect('Homepage:');
        }
HomePageModel.php
<?php
namespace App\Model;
use Nette;
class HomePageModel extends Nette\Object
{
    private $database;
    public function __construct($database) {
        $this->database=$database;
    }
        public function registerUser($login, $pass, $email)
    {
        $pass = password_hash($pass, PASSWORD_DEFAULT);
        $stmt = $this->database->prepare('INSERT INTO user (login, password, email, registered) VALUES (:l, :p, :e, NOW())');
        $stmt->bindValue(':l', $login);
        $stmt->bindValue(':e', $email);
        $stmt->bindValue(':p', $pass);
        return $stmt->execute();
    }
}
UserManager.php
<?php
namespace App\Model;
use Nette,
    Nette\Utils\Strings,
    Nette\Security\Passwords;
/**
 * @var App\UserManager
 * @inject
 */
class UserManager implements Nette\Security\IAuthenticator
{
    const
        TABLE_USER = 'user',
        COLUMN_ID_USER = 'id_user',
        COLUMN_NAME = 'login',
        COLUMN_PASSWORD_HASH = 'password',
        COLUMN_FIRST = 'first_name',
        COLUMN_LAST = 'last_name',
        COLUMN_ROLE = 'type_user';
    /** @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(self::TABLE_USER)->where(self::COLUMN_NAME, $username)->fetch();
        if (!$row) {
            throw new Nette\Security\AuthenticationException('Nesprávné přihlašovací jméno.', self::IDENTITY_NOT_FOUND);
        } elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
            throw new Nette\Security\AuthenticationException('Nesprávné přihlašovací heslo.', self::INVALID_CREDENTIAL);
        } elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
            $row->update(array(
                self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
            ));
        }
        $arr = $row->toArray();
        unset($arr[self::COLUMN_PASSWORD_HASH]);
        return new Nette\Security\Identity($row[self::COLUMN_ID_USER], $row[self::COLUMN_ROLE], $arr);
    }
    public function add(string $username, string $email, string $password) {
        try {
            $this->database->table(self::TABLE_USER)->insert(array(
                self::COLUMN_NAME => $username,
                self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
                self::COLUMN_EMAIL => $email,
            ));
        } catch (Nette\Database\UniqueConstraintViolationException $e) {
            throw new DuplicateNameException;
        }
    }
    public function isUsernameValid($username) {
        if ($this->database->table(self::TABLE_USER)->where(self::COLUMN_NAME, $username)->count() == 0) {
            return true;
        } else {
            return false;
        }
    }
     /**
     * Adds new user.
     * @param  string
     * @param  string
     * @return void
     */
    public function register($data) {
        $data["role"] = "member";
        $data["password"] = sha1($data["password"]);
        return $this->database->insert($this->table, $data)->execute(dibi::IDENTIFIER);
    }
}
class DuplicateNameException extends \Exception
{}
config.neon
parameters:
application:
	errorPresenter: Error
	mapping:
		*: App\*Model\Presenters\*Presenter
session:
	expiration: 14 days
database:
	dsn: 'mysql:host=127.0.0.1;dbname=db_name'
	user: root
	password:
	options:
	     lazy: yes
services:
    - App\Model\UserManager
    router: App\RouterFactory::createRouter
P.S. už som aj pc reštartovala:D
Ďakujem :)

- rkor
 - Člen | 62
 
V prípade prihlasovania mi vypisuje, že mám spatne heslo – do DB
ukládáš heslo jinak, než potom porovnánváš v loginu. Použij
Nette\Security\Passwords::hash($heslo).
Např.:
	$valid["password"] = Nette\Security\Passwords::hash($values["password"]);
Tady máš navíc lomítko na začátku – new \App\Model\HomePageModel…
$this->model = new App\Model\HomePageModel($this->context->getService("database"));
Nicméně chtělo by se to zanořit do dokumentace a trošku dostudovat věci
jako DI apod.
Mrkni na https://github.com/nette/sandbox –
tam uvidíš správný přístup, jak to dělat.
Editoval rkor (4. 5. 2018 21:59)