Config nastavení IAuthenticatoru – načítání roles, resources a privileges z databáze
- thm
- Člen | 147
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)