propojení přihlašování (CD-collection) a notORM

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

Mám funkční připojení k db pomocí notORM
a funkční přihlašování jak je v nette CD-collection
Potřeboval bych ovšem poradit, jak tyto dvě věci propojit do sebe…

jsem v situaci, kdy se mi zobrazí přihlašovací formulář (přihlašování beru z tabulky applications z https://pla.nette.org/…cy-injection) jakmile formulář odešlu, tak mi laděnka vypíše „Class ‚UsersModel‘ not found“ eventuálně výpis laděnky můžu poslat, ale spíš bych řekl, že nevím, jak upravit config.neon

	php:
		date.timezone: Europe/Prague

	services:
		authenticator:
			class: UsersModel # tohle se asi ladence nelibi

		robotLoader:
			run: true

		modelLoader:
			class: Diggriola\ModelLoader
			arguments: ['@dbConnection']

		dbConnection:
			factory: Diggriola\ModelLoader::dbConnect


production < common:

development < common:
	database:
		driver:   mysql
		host:     localhost
		database: nette_notorm
		username: php
		password: php
		profiler: true

console < common:

jinak ještě model Authenticator mám takový

<?php

use Nette\Object,
	Nette\Security as NS;


/**
 * Users authenticator.
 */
class Authenticator extends Object implements NS\IAuthenticator
{
	/**
	 * Performs an authentication
	 * @param  array
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;


    $row = $this->getModel('applications')->findByName($username);

		if (!$row) {
			throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
		}

		if ($row->author_id !== $password) {
			throw new NS\AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
		}

		unset($row->author_id);
		return new NS\Identity($row->id, NULL, $row->toArray());
	}
}

dík za pomoc :)

Jan Endel
Člen | 1016
+
0
-

class: UsersModel → class: Authenticator

green_user
Člen | 12
+
0
-

pilec napsal(a):

class: UsersModel → class: Authenticator

díky :) sice to ještě nevyřešilo můj problém, ale posunusel jsem se dál ;) a teď mi to vypisuje

Call to undefined method Authenticator::getModel().

ještě se na to podívám a snad něco vymyslím, proč to mám zle.

Jan Endel
Člen | 1016
+
0
-

Motáš dohromady presenter a model, ideální by bylo asi k tabulce User vytvořit model který by uměl něco takového:

class UserModel extends Nette\Object
{
	public function __construct($connection)
	{
		$this->connection = $connection;
	}

	public function getByName($username)
	{
		//NotORM zápis pro získáni uživatele z databáze
		return $user;
	}
}

do Authenticatoru bych přidal:

	public function __construct(UserModel $userModel)
	{
		$this->userModel = $userModel;
	}

a v config.neon pak snadno:

	authenticator:
        class: Authenticator
		arguments: [@userModel]

robotLoader:
        run: true

	userModel:
		class: UserModel
		arguments: ['@dbConnection']

modelLoader:
        class: Diggriola\ModelLoader
        arguments: ['@dbConnection']

dbConnection:
        factory: Diggriola\ModelLoader::dbConnect
Melmen
Člen | 132
+
0
-

Nechce se mi zbytečně zakládat nové téma, tak to píšu sem :)
Je to asi začátečnický dotaz, a možná se to spíš týká samotného NotORMu, ale patlám se v tom celej den a už nevím jak dál.

Mám tabulku users, a v ní sloupečky id (AI), username, password, email, atd… A za boha nemůžu přijít na to, jak uživatele přihlásit.

Chtěl bych použít funkci authenticate ze sandboxu ale tak, aby fungovala s NotORM.
Authenticator:

<?php

use Nette\Security as NS;


class Authenticator extends Nette\Object implements NS\IAuthenticator
{
	private $modelLoader;

	public function __construct(\Diggriola\ModelLoader $modelLoader)
	{
		$this->modelLoader = $modelLoader;
	}



	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		//$row = $this->users->where('username', $username)->fetch();

		$table = $this->modelLoader->getModel("user")->findByUsername($username);




		if ( !$table)  {
			throw new NS\AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
		}

		if ($table->password !== md5($password)) {
			throw new NS\AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
		}



		unset($table->password);
		return new NS\Identity($table->id, $table->role);


	}
}

Po odeslání formuláře mi to vyhodí chybu

Undefined property: NotORM_Result::$password

Díky za pomoc :)

duke
Člen | 650
+
0
-

Místo $table->password použij $table[‚password‘] (v Nette\Database je to jedno, ale v NotORM ne). Nicméně doporučuji změnit název proměnné z $table na $row, protože obsah té proměnné odpovídá řádku tabulky, nikoli celé tabulce.

Melmen
Člen | 132
+
0
-

Díky za odpověď. Přepsal jsem $table za $row :)
Nicméně teďka mi laděnka háže chybu invalid password (i když zadám správné údaje, nebo neexistující username).
V HomePagePresenteru jsem si dumpnul obsah $row $row = $this->getModel('user')->findByUsername('BumbleBee');(BumbleBee je existující uživatelské jméno) A výsledek dumpu je:

NotORM_Result(33) {
   single protected => FALSE
   select protected => array(0)
   conditions protected => array(1) [
      0 => "username" (8)
   ]
   where protected => array(1) [
      0 => "username = 'BumbleBee'" (22)
   ]
   parameters protected => array(0)
   order protected => array(0)
   limit protected => NULL
   offset protected => NULL
   group protected => ""
   having protected => ""
   lock protected => NULL
   union protected => array(0)
   unionOrder protected => array(0)
   unionLimit protected => NULL
   unionOffset protected => NULL
   data protected => array(1) {
      3 => NotORM_Row(15) {
         modified private => array(0)
         row protected => array(1) { ... }
         result protected => NotORM_Result(33) { *RECURSION* }
         connection protected => NULL
         driver protected => NULL
         structure protected => NULL
         cache protected => NULL
         notORM protected => NULL
         table protected => NULL
         primary protected => NULL
         rows protected => NULL
         referenced protected => array(0)
         debug protected => FALSE
         freeze protected => FALSE
         rowClass protected => "NotORM_Row" (10)
      }
   }
   referencing protected => array(0)
   aggregation protected => array(0)
   accessed protected => array(1) {
      id => TRUE
   }
   access protected => array(1) {
      id => TRUE
   }
   keys protected => array(1) [
      0 => 3
   ]
   connection protected => NULL
   driver protected => NULL
   structure protected => NULL
   cache protected => NULL
   notORM protected => NotORM(12) {
      connection protected => PDO(0)
      driver protected => "mysql" (5)
      structure protected => NotORM_Structure_Convention(4) {
         primary protected => "id" (2)
         foreign protected => "%s_id" (5)
         table protected => "%ss" (3)
         prefix protected => ""
      }
      cache protected => NotORM_Cache_Session(0)
      notORM protected => NULL
      table protected => NULL
      primary protected => NULL
      rows protected => NULL
      referenced protected => array(0)
      debug protected => Closure(3) {
         file => "/var/www/clients/client1/web3/libs/Diggriola/ModelLoader.php" (60)
         line => 65
         parameters => "$query, $parameters" (19)
      }
      freeze protected => FALSE
      rowClass protected => "NotORM_Row" (10)
   }
   table protected => "users" (5)
   primary protected => "id" (2)
   rows protected => array(1) {
      3 => NotORM_Row(15) {
         modified private => array(0)
         row protected => array(1) { ... }
         result protected => NotORM_Result(33) { *RECURSION* }
         connection protected => NULL
         driver protected => NULL
         structure protected => NULL
         cache protected => NULL
         notORM protected => NULL
         table protected => NULL
         primary protected => NULL
         rows protected => NULL
         referenced protected => array(0)
         debug protected => FALSE
         freeze protected => FALSE
         rowClass protected => "NotORM_Row" (10)
      }
   }
   referenced protected => array(0)
   debug protected => FALSE
   freeze protected => FALSE
   rowClass protected => "NotORM_Row" (10)

Pokud si dumpnu $row['password'], výsledek je NULL

petr.pavel
Člen | 535
+
0
-

Jak je z dumpu vidět :-), výsledkem je result, čili sada řádek. Takže není to $row, ale $result. Nad ním musíš ještě zavolat ->fetch(), abys získal první řádku ($row). Z té pak můžeš získat password přes $row[‚password‘].

Melmen
Člen | 132
+
0
-

Přepsal jsem to na

$result = $this->modelLoader->getModel('user')->findAll()->where('username', $username);

A pak to řeším přes

foreach ($result as $row)

Chvíli mi to trvalo, ale nakonec jsem na to přišel :) z $row jsem udělal public a kompetní $row vracím jako novou identitu. Nevím jestli je to košér, ale pro začátek je super, že to funguje :)

Díky za pomoc !

Editoval Melmen (5. 12. 2011 17:43)

duke
Člen | 650
+
0
-

Pokud tvůj systém vyžaduje unikátní usernames, pak není nutné procházet $result cyklem foreach, ale stačí ti jedno zavolání:

$row = $result->fetch();

Nicméně pokud má tvůj UserModel metodu findAll, předpokládal bych, že bude mít i svůj protipól, tj. něco jako findOne, či findByUsername. A nejspíš bych čekal, že tyto metody budou vracet rovnou výsledky (tj. v případě findOne bude volání fetch už přímo v něm), a nikoliv že nad nimi budu dál specifikovat dotaz.

Editoval duke (5. 12. 2011 21:07)