Ako na registráciu užívateľa?

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

zdravím…
Už dlhší čas sa snažím o registráciu úžívateľa a následný zápis do DB ale nejako to nejde rozhýbať snažím sa čo to nájsť tu na Nette ale vždy sa rieši len Login užívateľa …

Používam AuthPresenter na Registráciu,Prihlasovanie a Logout dúfam, že to nevadí, že sa to nejak spolu nebude byť atdˇ…

Ale čo potrebujem neviem ako čo najbezpečnejšie vytvoriť v Authenticator-y Registráciu užívateľa do DB a vlastne ako postupovať mohol by mi niekto kto bude taký dobrý zobraziť svoj Authenticator pre registráciu? aby som mohol vydieť ako to do seba zapája a ako na to ide? ďakujem všetkým vopred…

Šaman
Člen | 2666
+
0
-

Možná nechápu dotaz, ale registrace se dá udělat velmi jednoduše. Formulář na jméno a heslo (případně heslo dvakrát pro kontrolu), pomocí authenticatoru spočítat hash hesla a jméno a hash uložit do db.
V čem je problém?

Editoval Šaman (24. 3. 2013 15:47)

SontoEremo
Člen | 341
+
0
-

Šaman napsal(a):

Možná nechápu dotaz, ale registrace se dá udělat velmi jednoduše. Formulář na jméno a heslo (případně heslo dvakrát pro kontrolu), pomocí authenticatoru spočítat hash hesla a jméno a hash uložit do db.
V čem je problém?

Sorry asi som to dosť zle popísal…
Ide mi o to, že ako to vlastne napísať do toho Athenticatora ten postup zápisu atď…

Grelek
Člen | 233
+
0
-

Authenticator s registrací nemá co dělat. Registrace proběhne jako normální ukládání dat do databázové tabulky. Jediná věc, kterou budeš dělat s Authenticatorem je, že si zavoláš Authenticator::calculateHash($password).

SontoEremo
Člen | 341
+
0
-

Grelek napsal(a):

Authenticator s registrací nemá co dělat. Registrace proběhne jako normální ukládání dat do databázové tabulky. Jediná věc, kterou budeš dělat s Authenticatorem je, že si zavoláš Authenticator::calculateHash($password).

Samozrejme ale niekde predsa musím vytvoriť zápis dát do DB.. ale ako na to toť otázka!
Ten calculateHash to je aby som mohol spracovať heslo k prihláseniu ktoré v registrácii zahashujem nie?
Takže isto iste budem musieť vytvoriť nejaký model pre registráciu a zápis dát že? ale čo doň napísať ako začať to mi nie je jasné… potreboval by som vidieť nejaký už vytvorený model aby som vydel ako to funguje :) …

Grelek
Člen | 233
+
0
-

Nejprve si přečti celý QS. Sice tam nejspíš není vysvětlená registrace, ale z tvých příspěvku mi připadá, že ti chybí úplně základy. Po přečtení QS by jsi měl být schopen si to sám dopsat. A kdyby se ti to nedařilo, kdykoliv se můžeš zeptat na fóru, ale kód ti tu nikdo psát (nejspíš) nebude.

SontoEremo
Člen | 341
+
0
-

Grelek napsal(a):

Nejprve si přečti celý QS. Sice tam nejspíš není vysvětlená registrace, ale z tvých příspěvku mi připadá, že ti chybí úplně základy. Po přečtení QS by jsi měl být schopen si to sám dopsat. A kdyby se ti to nedařilo, kdykoliv se můžeš zeptat na fóru, ale kód ti tu nikdo psát (nejspíš) nebude.

Nemyslel som práve aby mi niekto napísal celý kód ale niekto čo má niečo podobné iba na ukážku…
QS a fórum a taktiež Planette Mám samozrejme na dennom poriadku len ta registrácia tam škoda, že nie je… ale skúsim teda niečo povystrájať a popýtať sa tu na fóre…

Šaman
Člen | 2666
+
0
-

V QS je editace, to je skoro stejné.
Ale v principu se můžeš inspirovat i obyčejným přihlašováním v SignPresenteru v Sandboxu. Jen bude rozdílná ta obslužná metoda – nebudeš přihlašovat, ale vkládat.

  1. Vytvoříš si v nějakém Presenteru formulář
  2. Injectneš si do tohoto presenteru authenticator (bude potřeba na hash) a UserRepository (nebo databázi, když nemáš model)
  3. Po odeslání formuláře si v obslužné metodě (stále v presenteru) nejprve pomocí authenticatoru spočítáš hash a potom pomocí modelu, nebo databáze (fuj) vložíš nového uživatele do tabulky.
  4. nepovinně si pak můžeš osvobodit formulář z Presenteru a mít ho jako komponentu, až to budeš umět.
bazo
Člen | 620
+
0
-

neviem, co do registracie tahas nejaky authenticator, ten s registraciou nema spolocne nic.

registracia je velmi easy:

vytvoris formular

v metode na spracovanie formulara zahashujes heslo, pouzi bcrypt(pre jednoduchost mozno pouzit jednu z milion phpass kniznic)

ulozis do db

hotovo

SontoEremo
Člen | 341
+
0
-

bazo napsal(a):

neviem, co do registracie tahas nejaky authenticator, ten s registraciou nema spolocne nic.

registracia je velmi easy:

vytvoris formular

v metode na spracovanie formulara zahashujes heslo, pouzi bcrypt(pre jednoduchost mozno pouzit jednu z milion phpass kniznic)

ulozis do db

hotovo

Toto je môj AuthPresenter

<?php
namespace FrontModule;

use Nette\Application\Ui\Form,
    Nette\Utils\Html,
    Country,
    DatePicker;

class AuthPresenter extends \BasePresenter
{

	protected function createComponentUserRegisterForm()
	{
		$form = new Form;
		$form->addText('uname', 'Užívateľské meno:')
		     ->setRequired('Prezývka je povinná!');
		$form->addText('umail', 'Emailová adresa:')
		     ->setRequired('Email je povinný!')
		     ->addRule(Form::EMAIL, 'Zadajte prosím, platnú emailovú adresu!');
		$form->addPassword('upass', 'Heslo:')
		     ->setRequired('Heslo je povinné!')
		     ->addRule(Form::MIN_LENGTH, 'Heslo musí obsahovať min. %d znaky', 4);
		$sex = array('m' => 'Muž','f' => 'Žena',);
		$form->addRadioList('ugender', 'Pohlavie:', $sex)
		     ->setRequired()
		     ->getSeparatorPrototype()->setName(NULL);
		$form->addDatePicker('birthDate', 'Dátum Narodenia:')
    		 ->setAttribute('class', 'birthDate')
    		 ->addRule(Form::VALID, 'Entered birth date is not valid!');
		$ucountries = $this->CountryList();
		$prompt = Html::el('option')->setText('Vyberte Krajinu')->class('prompt');
		$form->addSelect('ucountry', 'Krajina:', $ucountries)
		     ->setPrompt($prompt)
		     ->setRequired();
		$form->addCheckBox('uagree', Html::el('span')
			 ->setHtml('Súhlasím s <a href="../docs/Terms" target="_blank">Podmienkamy</a>'))
		     ->addRule(Form::EQUAL, 'Musíte súhlasiť s podmienkamy!', TRUE);
		$form->addSubmit('uregme', 'Registrovať');
		$form->onSuccess[] = $this->UserSuccessRegisterSubmitted;
		return $form;
	}

	public function UserSuccessRegisterSubmitted(Form $form)
	{

	}
}

A toto mám v Athenticatori

<?php

use Nette\Security as NS,
	Nette\Utils\Strings;

class VP_Authenticator extends Nette\Object implements NS\IAuthenticator
{
	/** @var Nette\Database\Connection */
	private $database;


	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}

	public function createaddInDbUser($uname, $umail, $upass, $ugender, $birthDate, $ucountry)
	{
		return $this->getTable()->insert(array(
			'uname' => $uname,
			'umail' => $umail,
			'upass' => $upass,
			'ugender' => $ugender,
			'birthDate' => $birthDate,
			'ucountry' => $ucountry,
			));
	}

	public function authenticate(array $credentials)
	{

	}
}

Ako, že prečo ťahám Authenticator do Registrácie veď predsa v ňom vytvorím nejakú DB nie?
Či v presentery kde je reg. formulár to mám nejako vytvárať?
Jééžiši kriste Už sa musím sám na sebe smiať, že sa tu musím tak hlúpo pýtať :) ale nevadí každá hlúpa otázka nájde múdru odpoveď :)

Grelek
Člen | 233
+
0
-

Ty teď používáš VP. Někam se ti z MVP vytratily ty modely. Authenticator by měl využívat třeba nějaký UserRepository, který bude uživatele přidávat, měnit, odebírat atd. O to by se neměl Authenticator vůbec starat a předávat to modelu. Vlastně to tvé spíš není Authenticator, ale třída, která jen implementuje jeho rozhraní.

Doopravdy, zkus jít podle toho QS.

bazo
Člen | 620
+
0
-

Stale nechapem, co do toho vsetci pletiete authenticator. Authenticator ma za ucel overit uzivatela, nic ine.

ten tvoj kod by na prvy pohlad mal byt funkcny, len to mas trosku nevhodne navrhnute.

na tvojom mieste by som vytvoril nejaky lepsie UserRepository, ktory sa bude starat len o ukladanie a vytahovanie z db.

este si vytvor sluzbu na hashovanie hesiel, nic ine ako bcrypt by si nemal pouzivat, nazvi to napriklad passwordHasher

dalej vytvor dalsiu triedu UserModel napriklad, ktora bude tuto vyuzivat repository, a password hasher. UserModel bude mat metod register(…), v ktorej vytvoris hash zadaneho hesla, pretrans formujes data na format, ktory ti spracuje user repository a zavolas insert na repository, posles email alebo cokolvek

a co sa tyka authenticatoru:
tomu injectnes repository a password hasher, v metode authenticate vytiahnes usera podla loginu a potom overis heslo pomocou password hasheru

profit!

Šaman
Člen | 2666
+
0
-

WTF? Výpočet hashe má být na jediném místě někde v modelu. A v sandboxu (předpokládám, že vycházíš z něho) je tento výpočet v authenticatoru. Bazo, ty mu radíš přepsat Sandbox, když neumí základy?

@SontoEremo:
Přejmenuj si prosím AuthPresenter a buď to řeš v UserPresenter (renderRegister) nebo v RegisterPresenter. Ten tvůj presenter nikoho neautentifikuje, jen tě to mate. Bazo má pravdu, že tato úloha s authentizací nesouvisí a jediný, co po autenticatoru budeš chtít je spočítat heslo. Kromě toho zapomeň na cokoliv co začíná na Auth*.

Za druhé ten zápis do db vyhoď z authenticatoru a na něj vůbec nešahej. Podle principu, že každá třída dělá jen jednu věc tento autenticator jen ověří ze zadaných údajů správnost hesla a kromě toho to heslo umí i spočítat. A ty budeš potřebovat jen spočítat heslo, zapisovat uživatele do db musíš někde jinde (UserRepository, UserModel, nebo jak se to u tebe jmenuje).

Viz můj předchozí příspěvek. Vážně můžeš přepsat přihlašovací presenter a formulář, dokonce tam máš myslím už injectovaný jak UserRepository, tak Authenticator.

Editoval Šaman (24. 3. 2013 21:56)

bazo
Člen | 620
+
0
-

ja vobec netusim, co je v sandboxe. ono je dost nestasne mat hashovanie hesla len v authenticatore, praktickejsie je to mat ako samostatnu sluzbu.

ako pozeram tak sandbox upgradoval hashovanie, co je chvalyhodne.

SontoEremo
Člen | 341
+
0
-

bazo napsal(a):

ja vobec netusim, co je v sandboxe. ono je dost nestasne mat hashovanie hesla len v authenticatore, praktickejsie je to mat ako samostatnu sluzbu.

ako pozeram tak sandbox upgradoval hashovanie, co je chvalyhodne.

Vďaka za odpovede a za rady :)
Tak som šiel podľa examples v Nette konkrétne podľa CD-collection…

Len som sa stretol s takou menšou chybou:
Nette\DI\ServiceCreationException

No service of type FrontModule\UserRepository found. Make sure the type hint in Method FrontModule\UserPresenter::injectUserRepository() is written correctly and service of this type is registered.

Netuším ako ju zaregistrovať…

Šaman
Člen | 2666
+
0
-

Služby se registrují v configu. V QuickStartu máš ukázku přímo s UserRepository, v CD máš AlbumRepository.
Ale myslím, že nepoužíváš moduly, takže si uprav Namespace.