kam umístit nette autenticator?

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

Ahoj,

něják si nevím rady s tím kam umístit autenticator.

Prdl jsem ho do basepresenteru, ale potom bude potřebovat zaregistrovat jako služba v configuje a říkám si, jestli je to rozumné?

Umístil jsem ho tam proto, protože tam vytvářím připojení k db.

Říkal jsem si že vytvoříl prvně složku v modelu authenticator.php a do něj umístím tu předepsanou metodu. Jenže jsem si uvědomil, že tam budu muset dědit base přesenter s připojením.

takže class authenticator extends basePresenter implements authenticator{}

jenže problém je v tom, že z příkladů je vidět, že authenticator dědí nette object.

Jak toto mohu vyřešit? Stačí nad tím prostě zavolat třeba místo dědění:
USE nette\object

? a je to?

qteck
Člen | 164
+
0
-

nebo že by base repository dědil nette object, bylo by to tak okay?

duke
Člen | 650
+
0
-

Do presenteru bych to nedával. Patří to do modelové vrstvy, což presenter není. Vytvoř si např. nějakou svou službu, která řeší (resp. zprostředkovává) vše kolem uživatelů a té přidej rozhraní Nette\Security\IAuthenticator a naimplementuj její metodu authenticate()

qteck
Člen | 164
+
0
-

jj udělal jsem to takto, šlomi předvším o to dědění nette object, nakonec jsem ho dal do baserepository, takže ho teď dědí všechn repositáře, což se mi možná nelíbí, ale opravdu by nemělo?

vytvořil jsem si Authenticator, podědil baserepository a implementoval iauthenticator.

zařegistroval jsem to do configu jako nromální službu a teď to jdu prubnout, tak prstíky pro mě.

David Matějka
Moderator | 6445
+
0
-

dedeni Nette\Object neni nutne, ale uzitecne, viz dokumentace, kde jsou popsany funkce Nette\Objectu

qteck
Člen | 164
+
0
-

oka,y díky.

nétte mi teď hlasí toto:
Nette\DI\ServiceCreationException

Class Repository\NetteAuthenticator used in service ‚authenticator‘ has not been found or is not instantiable.

v configu to mám zapsané takto:
services:
authenticator: Repository\NetteAuthenticator

a authenticator vypadá takto:

<?php

namespace Repository;
namespace App\Model;

use Nette,
	Nette\Utils\Strings,
	Nette\Security\Passwords;


/**
 * Authenticator overridden by nette
 */

class NetteAuthenticator extends BaseRepository implements Nette\Security\IAuthenticator
{
	const
		TABLE_NAME = 'users',
		COLUMN_ID = 'id',
		COLUMN_NAME = 'name',
		COLUMN_PASSWORD_HASH = 'password',
		COLUMN_ROLE = 'role';


	/**
	 * Performs an authentication.
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;

		$row = $this->conn->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();

		if (!$row) {
			throw new Nette\Security\AuthenticationException('The username is incorrect.', self::IDENTITY_NOT_FOUND);

		} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
			throw new Nette\Security\AuthenticationException('The password is incorrect.', 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], $row[self::COLUMN_ROLE], $arr);
	}


	/**
	 * Adds new user.
	 * @param  string
	 * @param  string
	 * @return void
	 */
	public function add($username, $password)
	{
		$this->database->table(self::TABLE_NAME)->insert(array(
			self::COLUMN_NAME => $username,
			self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
		));
	}

}

Co si o tom myslíte?

Díky

Editoval qteck (12. 6. 2014 17:48)

duke
Člen | 650
+
+1
-

Dědičnost bys měl používat pouze tam, kde se jedná o vztah generalizace-specializace, což tento případ není, neboť autentikátor z logiky věci není speciálním případem repozitáře. Lepší řešení je kompozice, kdy autentikátoru předáš jako závislost repozitář uživatelů. Autentikátor může být řešen jako jednoduchá služba, která nic jiného než autentikaci neřeší, a nebo můžeš zvolit řešení, kdy máš nějakou fasádu Users, která řeší mj. i tu autentikaci.

qteck
Člen | 164
+
0
-

okay, a co si myslte o této chybě?

Nette\DI\ServiceCreationException

Class Repository\NetteAuthenticator used in service ‚26_Repository_NetteAuthenticator‘ has not been found or is not instantiable.

David Matějka
Moderator | 6445
+
0
-

mas tam 2× uveden namespace:

namespace Repository;
namespace App\Model;
qteck
Člen | 164
+
0
-

Ou, :D, tak toho jsem si nevšiml, díky :D

qteck
Člen | 164
+
0
-

ještě otázka,

k čemu tady v tom slouží ta poslední větev?

<?php
		if (!$row) {
			throw new Nette\Security\AuthenticationException('Uvedené jmeno je nesprávné.', self::IDENTITY_NOT_FOUND);

		} elseif (md5($password) != $row[self::COLUMN_PASSWORD_HASH]) {
			throw new Nette\Security\AuthenticationException('Zadané heslo je nesprávné.', self::INVALID_CREDENTIAL);

		} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
			$row->update(array(
				self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
			));
		}

diky

qteck
Člen | 164
+
0
-

tak toto už vím:

  • jen velké IIII V @inject

a ještě jedna teda,

hlásí mi to teď:

Fatal Error

Call to a member function add() on a non-object
<?php

	/**
	 * Adds new user.
	 * @param  string
	 * @param  string
	 * @return void
	 */
	public function add($username, $password)
	{
		$this->conn->table(self::TABLE_NAME)->insert(array(
			self::COLUMN_NAME => $username,
			self::COLUMN_PASSWORD_HASH => md5($password),
		));
	}

a volám jí v presenteru klasicky $this->logIn->add()

log in je injecnnutá proměná,

/** @var \Repository\Auth @inject

Editoval qteck (12. 6. 2014 18:40)

David Matějka
Moderator | 6445
+
0
-

nemas ji protected? properties s @inject anotaci museji byt public

a tam k tomu needsRehash – tam se kontroluje, jestli je heslo zahashovano dostatecne silne a pripadne prehashuje

Editoval matej21 (12. 6. 2014 18:40)

qteck
Člen | 164
+
0
-

nakonec jen velké I v @inject anotaci,

Díky.

Ou, to je zajímavé :-)))

Díky.