Pomoc s registráciou a prihlasovaním

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

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

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)

Sonya
Člen | 2
+
0
-

Ja som skúšala aj ten sandbox, mala som to presne tak isto a furt mi vyhadzovalo problem, ze nenajde triedu forms a tiez som nevedela co s tym..