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)