propojení přihlašování (CD-collection) a notORM
- green_user
- Člen | 12
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 :)
- green_user
- Člen | 12
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
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
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 :)
- Melmen
- Člen | 132
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
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
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
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)