Config nastavení IAuthenticatoru – načítání roles, resources a privileges z databáze

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

Zdravím vás,
prosím o radu a případné zhodnocení toho, jestli to o co se snažím, je cesta do pekel nebo ne. Nějak se moc neorientuju v návrhových vzorech, tak nevím, jestli se to nedělá trochu jinak.

V configu současně mám:

authorizatorFactory: App\AuthorizatorFactory
authorizator: @authorizatorFactory::create

Authorizator vrací \App\ACL což je potomek \Nette\Security\Permission

Permission jsem podědil, protože bych v ACL viděl metodu (když to teď budu brát pouze v souvislosti s resources s rolemi to bude podobné, s privileges také).

/** Přidá zdroj resources k ACL */
public function addResourceSource(IResourceSource $resourceSource){
            $this->resourceSources[] = $resourceSource;
      }

Rozhraní IResourceSource (zdroj resources pro ACL (Permission) pro metodu addResource()):

interface IResourceSource {
      /** @return array of string (resources) */
      public function getResources();
}

Toto rozhraní bych použil například u repositories, nebo u čehokoliv co je zdrojem resources pro permission

class OrganizationRepository extends \TH\Database\EntityRepository implements IResourceSource{

      public function getResources() {
            foreach($this->getEntities($this->find()) as $iResource) $resources[] = 'org-'.$iResource->getResourceId();
            return isset($resources) ? $resources : array();
      }
}

Teď ale nevím, jak to zapsat do configu, abych mohl třídě ACL nadefinovat IResourceSource(s) A potom jí řekl, aby si prošla $this->resourceSources //array of IResourceSource a nacucla je.

//ACL
public function loadResources(){
            foreach($this->resourceSources as $resourceSource)
                  foreach($resourceSource->getResources() as $resource)
                        $this->addResource($resource);
      }

Představoval bych si to nějak takto (ale teď píšu fakt kraviny):

services:

	orgranizationRepository: App\Model\OrganizationRepository

	authorizatorFactory: App\AuthorizatorFactory
	acl:
		class: @authorizatorFactory::create
		setup:
			- addResourceSource(orgranizationRepository)
			...
			...
			...
			- loadResources()

Takhle to nejde, vyhazuje: Class or interface @authorizatorFactory::create used in service ‚acl‘ not found. Určitě to chce jenom třídu a já už dávám objekt.

acl: @authorizatorFactory::create
	setup:
		- addResourceSource(orgranizationRepository)

Pokud to napíšu takto, tak vyhazuje Bad indentation on line (u setup:)

	acl: @authorizatorFactory::create
	acl:
		setup:
			- addResourceSource(orgranizationRepository) ...

No a takhle to taky nejde :) – Duplicated key ‚acl‘

Tohle opravdu nevím jak na"config"urovat.

V configu mám zmatek, zatím jsem ho používal jenom k registraci anonymních služeb a autowiringu, ale rád bych proniknul i do tohoto. Dokumentaci jsem četl ale lépe se mi to učí na příkladech, které vychází z mých problémů.

Určitě nebude dobré při každém spuštění načítat všechna resources, roles a privileges s DB abych se pak u jednoho přihlášeného uživatele ptal jestli může nebo nemůže něco. Budu to asi muset nějak Cacheovat (k tomu jsem se zatím vůbec neprokousal – kdyby někdo chtěl přispět i k této problematice, budu rád), nebo načítat lazy (což bych asi věděl, jak to udělat – vzhledem k tomu že ACL je poděděná od Permission a bude mít zaregistrované IResourceSource(s), IRoleSource(s), IPrivilegeSource(s), tak bych asi jenom odchytával PermissionExeption a dotazoval se příslušných zdrojů na konkrétní věci).

Třeba to dělám ale celé špatně a je to k ničemu :)
Díky za každý příspěvek do diskuze (pokud to někdo ode mně pochopil).

Editoval thm (20. 2. 2015 12:45)

thm
Člen | 147
+
0
-

Aha. Factory:

acl:
	create: @authorizatorFactory::create
	setup:
		- addResourceSource(@organizationRepository)