Authenticator s ModelLoaderem

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

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
+
0
-

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
+
0
-

a ako mam pootm pristupit ku salt-u ked v classe authenticator nemam context ale len @modelLoader?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Salt je kde, v configu? Třeba jako další argument za @modelLoader?

David Ďurika
Člen | 328
+
0
-

ano je tam… na podobne riesenie som myslel aj ja… ale neda sa k tomu pristupit inac?

Filip Procházka
Moderator | 4668
+
0
-

A proč by mělo?

pawouk
Člen | 172
+
0
-

achtan napsal(a):

ano je tam… na podobne riesenie som myslel aj ja… ale neda sa k tomu pristupit inac?

Také nechápu otázku, zkus to nějak rozvést.

David Ďurika
Člen | 328
+
0
-

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
+
0
-

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
+
0
-

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)

wopice
Člen | 21
+
0
-

A najednou máš celý Authenticator závislý na třídě Nette\DI\Container.

<?php

$salt = $this->container->params["security"]["salt"];

?>
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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'];
}
Majkl578
Moderator | 1364
+
0
-

vojtech.dobes napsal(a):

Taky je možnost použít na potřebném místě:

Environment::getVariable('salt');

Ale notak, z toho jsme snad už vyrostli, ne? Řešení v mém předchozím příspěvku nevyhovuje?

David Ďurika
Člen | 328
+
0
-

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
+
0
-

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é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. …

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
+
0
-

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).