Authenticator s ModelLoaderem
- Ginny
- Člen | 36
Zdravím, řeším teď problém, jak udělat vlastní authenticator…Více méně vycházím z examples a mám model loader…Config vypadá takto:
services:
authenticator:
class: UsersModel
arguments: ["@database"]
robotLoader:
run: true
database:
class: Nette\Database\Connection
arguments: [sqlite2:%appDir%/models/demo.db]
modelLoader:
class: ModelLoader
arguments: ["@database"]
Ten authenticator asi dobře nemám, zajímá mě, jak na to. V CD-Collection je to jednoduché, tady se to komplikuje tím model loaderem.
Editoval Ginny (19. 6. 2011 21:17)
- srigi
- Nette Blogger | 558
Kedze si do modelLoader
injektujes sluzbu database
,
nemusis do autenticator
predavat tuto sluzbu ale
modelLoader
:
authenticator:
class: UsersModel
arguments: ["@modelLoader"]
Nette je chytre :) Pri vytvarani modelLoader
z
config.neon
zisti, ze potrebuje database
a preto
najskor vytvori tu, injektne ju do modelLoader
ten potom injektne
do authenticator
.
- David Ďurika
- Člen | 328
a ako mam pootm pristupit ku salt-u ked v classe authenticator nemam context ale len @modelLoader?
- Vojtěch Dobeš
- Gold Partner | 1316
Salt je kde, v configu? Třeba jako další argument za
@modelLoader
?
- David Ďurika
- Člen | 328
ano je tam… na podobne riesenie som myslel aj ja… ale neda sa k tomu pristupit inac?
- David Ďurika
- Člen | 328
tak skusim ukazku kodu:
config.neon
<?php
common:
...
services:
authenticator:
class: Core\Security\Authenticator
arguments: [@modelLoader]
...
?>
auth
<?php
...
class Authenticator extends Object implements IAuthenticator
{
/** @var \Nette\DI\Container */
private $model;
public function __construct(\ModelLoader $modelLoader) {
$this->model = $modelLoader;
}
public function authenticate(array $credentials) {
...
}
public function calculateHash($password) {
return hash('sha1', $password . ''/* tuto potrebujem salt ako nato? */ );
}
}
?>
- Filip Procházka
- Moderator | 4668
Přidáš argumenty
arguments: [@modelLoader, '%salt%']
upravíš třídu
class Authenticator extends Object implements IAuthenticator
{
/** @var \Nette\DI\Container */
private $model;
/** @var string */
private $salt;
public function __construct(\ModelLoader $modelLoader, $salt)
{
$this->model = $modelLoader;
$this->salt = $salt;
}
public function authenticate(array $credentials)
{
...
}
public function calculateHash($password)
{
return hash('sha1', $password . $this->salt);
}
}
- David Ďurika
- Člen | 328
no ano to pisal uz aj vojtech.dobes ale ci sa to neda nejak efektivnejsie :), ked nahodou budem chciet dalsiu vec s configu tak pridam znova dalsie param… a tak to budme pridavat az donemoty…
ale v takom pripade by sa to malo spravit asi takto: ±preklepy :)
<?php
arguments: [@modelLoader, @container]
?>
<?php
class Authenticator extends Object implements IAuthenticator
{
/** @var \Nette\DI\Container */
private $model;
/** @var string */
private $container;
public function __construct(\ModelLoader $modelLoader, $container)
{
$this->model = $modelLoader;
$this->container = $container;
}
public function authenticate(array $credentials)
{
...
}
public function calculateHash($password)
{
return hash('sha1', $password . $this->container->security->salt);
}
}
?>
btw: nevime ci toto $this->container->security->salt je na 100%
spravne… to som len tak tipol…
ak nie tak ma opravte pls
v configu je to:
<?php
security:
salt: zb1g7IHt1I
?>
EDIT:
prave som zistil ze mam nieco zle, presnejsie: ‚The definition of service
security is missing factory method‘. Kde je probem?
Editoval achtan (3. 8. 2011 16:58)
- Vojtěch Dobeš
- Gold Partner | 1316
Taky je možnost použít na potřebném místě:
Environment::getVariable('salt');
Jestli tě prudí každou změnu závislosti tvého
authenticatoru
na vnějších informacích a službách projevovat
změnou konstruktoru a vidíš v tom jen zdržení, je to taky možnost. Ale
pokud chceš svůj kód testovat, tak jakmile budeš v testu vytvářet
instanci tvého authenticatoru
, bude pro tebe mnohem jednodušší
předat mu do konstruktoru to, co zcela jasně potřebuješ, a ne kvůli tomu
vytvářet instanci Nette\DI\Container
, jemu předávat parametry,
spoléhat se, že vevnitř tvé třídy budou v Containeru
na
správném místě atd. …
Kromě toho si lze udělat v configu pole parametrů, a v konstruktoru si předávat to pole.
common:
services:
authenticator:
class: Core\Security\Authenticator
arguments: [@modelLoader, '%authentication%']
authentication:
salt: oasdfasdp
public function __construct($modelLoader, $params)
{
$this->params = $params;
$salt = $this->params['salt'];
}
- David Ďurika
- Člen | 328
no ja mam zapacovany ten tvoj modelLoader to funguje… ale nevime presne ako by som mal vyriesit tento moj problem. preto som to viriesil tak ako pisal vojtech.dobes
<?php
common:
services:
authenticator:
class: Core\Security\Authenticator
arguments: [@modelLoader, '%authentication%']
authentication:
salt: oasdfasdp
public function __construct($modelLoader, $params)
{
$this->params = $params;
$salt = $this->params['salt'];
}
?>
- Patrik Votoček
- Člen | 2221
vojtech.dobes napsal(a):
Jestli tě prudí každou změnu závislosti tvého
authenticatoru
na vnějších informacích a službách projevovat změnou konstruktoru a vidíš v tom jen zdržení, je to taky možnost. Ale pokud chceš svůj kód testovat, tak jakmile budeš v testu vytvářet instanci tvéhoauthenticatoru
, bude pro tebe mnohem jednodušší předat mu do konstruktoru to, co zcela jasně potřebuješ, a ne kvůli tomu vytvářet instanciNette\DI\Container
, jemu předávat parametry, spoléhat se, že vevnitř tvé třídy budou vContaineru
na správném místě atd. …
Není co dodat… Používat jednou DI Container a podruhé Service Locator je snad ještě věší „prasárna“ než používat jenom Service Locator (tím se nechci nikoho dotknout – taky jsem to tak ve svých DI začátcích dělal).
- Vojtěch Dobeš
- Gold Partner | 1316
Majkl578 napsal(a):
Ale notak, z toho jsme snad už vyrostli, ne? Řešení v mém předchozím příspěvku nevyhovuje?
Díky za reflexi, asi jsem zvolil příliš vstřícný jazyk, jestli
celkově příspěvek vyzněl, jakože tohle doporučuju :) Takže pro jistotu:
samozřejmě, že Environment::getVariable( ... )
je
lepší se vyhnout (to v testu nelze slušně podstrčit
nijak).