Found sections ‚authenticator‘, ‚authorizator‘ in configuration, but corresponding extensions are missing

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

Udělal jsem si Autentifikator a autorizator podle návodu a hlasí mi to. Found sections ‚authenticator‘, ‚authorizator‘ in configuration, but corresponding extensions are missing.

<?php
 ...\htdocs\task2\vendor\nette\di\src\DI\Compiler.php:137	source  Nette\DI\Compiler-> processExtensions ()

...\nette\bootstrap\src\Bootstrap\Configurator.php:267	source  Nette\DI\Compiler-> compile ()

inner-code	Nette\Configurator-> generateContainer (arguments)

...\task2\vendor\nette\di\src\DI\ContainerLoader.php:111	source  call_user_func_array (arguments)

...\task2\vendor\nette\di\src\DI\ContainerLoader.php:76	source  Nette\DI\ContainerLoader-> generate (arguments)

...\task2\vendor\nette\di\src\DI\ContainerLoader.php:41	source  Nette\DI\ContainerLoader-> loadFile (arguments)

...\nette\bootstrap\src\Bootstrap\Configurator.php:221	source  Nette\DI\ContainerLoader-> load (arguments)

C:\xampp\htdocs\task2\app\bootstrap.php:19	source  Nette\Configurator-> createContainer ()

 9:
10:    $configurator->setTempDirectory(__DIR__ . '/../temp');
11:
12:    $configurator->createRobotLoader()
13:        ->addDirectory(__DIR__)
14:        ->register();
15:
16:    $configurator->addConfig(__DIR__ . '/config/config.neon');
17:    $configurator->addConfig(__DIR__ . '/config/config.local.neon');
18:
19:    $container = $configurator->createContainer();
20:
21:    return $container;
22:

C:\xampp\htdocs\task2\www\index.php:6	source  require (arguments)

?>

Podle mě mam něco blbě v config neon.

CZechBoY
Člen | 3608
+
0
-

Musíš to dát do sekce services:

services:
	authenticator: App\MyAuthenticator
	authorizator: App\MyAuthorizator

Editoval CZechBoY (15. 12. 2015 22:52)

cvit84
Člen | 43
+
0
-

CZechBoY napsal(a):

Musíš to dát do sekce services:

services:
	authenticator: App\MyAuthenticator
	authorizator: App\MyAuthorizator

Class UserManager used in service ‚authenticator‘ not found or is not instantiable. search►

Source file
Call stack

    ...\task2\vendor\nette\di\src\DI\ContainerBuilder.php:422	source  Nette\DI\ContainerBuilder-> resolveEntityClass (arguments)

    ...\task2\vendor\nette\di\src\DI\ContainerBuilder.php:316	source  Nette\DI\ContainerBuilder-> resolveServiceClass (arguments)

    ...\htdocs\task2\vendor\nette\di\src\DI\Compiler.php:202	source  Nette\DI\ContainerBuilder-> prepareClassList ()

    ...\htdocs\task2\vendor\nette\di\src\DI\Compiler.php:139	source  Nette\DI\Compiler-> generateCode (arguments)

    ...\nette\bootstrap\src\Bootstrap\Configurator.php:267	source  Nette\DI\Compiler-> compile ()

    inner-code	Nette\Configurator-> generateContainer (arguments)

    ...\task2\vendor\nette\di\src\DI\ContainerLoader.php:111	source  call_user_func_array (arguments)

    ...\task2\vendor\nette\di\src\DI\ContainerLoader.php:76	source  Nette\DI\ContainerLoader-> generate (arguments)

    ...\task2\vendor\nette\di\src\DI\ContainerLoader.php:41	source  Nette\DI\ContainerLoader-> loadFile (arguments)

    ...\nette\bootstrap\src\Bootstrap\Configurator.php:221	source  Nette\DI\ContainerLoader-> load (arguments)

    C:\xampp\htdocs\task2\app\bootstrap.php:19	source  Nette\Configurator-> createContainer ()

     9:
    10:    $configurator->setTempDirectory(__DIR__ . '/../temp');
    11:
    12:    $configurator->createRobotLoader()
    13:        ->addDirectory(__DIR__)
    14:        ->register();
    15:
    16:    $configurator->addConfig(__DIR__ . '/config/config.neon');
    17:    $configurator->addConfig(__DIR__ . '/config/config.local.neon');
    18:
    19:    $container = $configurator->createContainer();
    20:
    21:    return $container;
    22:

    C:\xampp\htdocs\task2\www\index.php:6	source  require (arguments)

chyba se změnila :(

CZechBoY
Člen | 3608
+
0
-

No mrkni jestli si zadal správně třídu (i se jmenným prostorem)autentizatoru. A jestli se soubor nachází uvnitř složky App.

cvit84
Člen | 43
+
0
-

Ja to jedu podle toho tutorialu a prostě nevím co dělám špatně. :( Je fakt že nemám vytvořenou šablonu ze sign.in do stranky projekt. Ale to by mi laděnka řvala že nenašla šablonu a ne tohle.

tady je odkaz na tutorial: "":https://doc.nette.org/…thentication

Šaman
Člen | 2666
+
+1
-

Ale v tom návodu se nikde o UserManager nepíše, ne? Možná na jiných stránkách, ale spíš mám pocit, že používáš autentikátor ze sandboxu.
Jinak tohle souvisí spíš se základy OOP. Ta DI není žádná magie, možná ti to tak zprvu připadá, ale kromě automatického dosazení závislostí na tom není nic zvláštního.

Ty chceš po DI kontejneru vytvořit instanci třídy App\MyAuthenticator. Ta ale vyžaduje \UserManager (nejspíš ji vyžduješ v konstruktoru). No a ta hláška říká, že DI kontejner nemůže vytvořit instanci \UserManager, takže ani nemůže vytvořit authenticator a tak to celé spadne hned na začátku. V takovém případě si zkontroluj hlavně namespaces (opravdu ten UserManager žádné NS nemá?), dále si zkonstroluj, že o něm DI kontejner ví (je zapsaný někde v configu v sekci services) a případně že je ta třída v přístupné složce (jestli máš všecho v /app, nebo /vendor, tak je to bez problémů).

A když potřebuješ poradit, tak sem neposílej výpis o tom, že nejde vytvořit kontejner. Pošli sem tvůj config (v něm byla chyba v prvním dotazu) a dále obě třídy o kterých je zmínka (tedy v tomto případě App\MyAuthenticator a UserManager).

Ale když si zkontroluješ NS a ověříš si, že jsou obě třídy registrované v configu, tak na 90% bude chyba vyřešená.

cvit84
Člen | 43
+
0
-

tak to bylo tím, že jsem měl v ACL – Nette\Security\Permission Respektive jsem v ACL tuhle třídu dědil a tyhle dvě třídy usermanager a acl jsem měl v namespace app\Permission\acl a namespace app\Permission\usermanager

cvit84
Člen | 43
+
0
-

Resource ‚Sign‘ does not exist. search►

22: if (!$this->user->isLoggedIn()) {
23: if ($this->user->getLogoutReason() === User::INACTIVITY) {
24: $this->flashMessage(‚Session timeout, you have been logged out‘);
25: }
26:
27: $this->redirect(‚Project:view‘, array(
28: ‚backlink‘ ⇒ $this->storeRequest()
29: ));
30:
31: } else {
32: if (!$this->user->isAllowed($this->name, $this->action)) {
33: $this->flashMessage(‚Access denied‘);
34: $this->redirect(‚Sign:view‘);
35: }
36: }

Zase problém s tímhle. To tu není nikde postup na autorizaci uživatelů, aby člověk nemohl udělat chybu. :( ách joooooooooooo

cvit84
Člen | 43
+
0
-
if (!$this->user->isAllowed($this->name, $this->action))

Udajně problém s tímto

F.Vesely
Člen | 369
+
0
-

cvit84 napsal(a):

Zase problém s tímhle. To tu není nikde postup na autorizaci uživatelů, aby člověk nemohl udělat chybu. :( ách joooooooooooo

Je https://doc.nette.org/…thentication#…

cvit84
Člen | 43
+
0
-

F.Vesely napsal(a):

cvit84 napsal(a):

Zase problém s tímhle. To tu není nikde postup na autorizaci uživatelů, aby člověk nemohl udělat chybu. :( ách joooooooooooo

Je https://doc.nette.org/…thentication#…

To mam přečtené. Podle mě to mam v ACL nastavené dobře a i dobře zaregistrované ve službách. I ve startupu presenteru kde se ověřuje, zda daný uživatel má podle role do šablony přístup. Prostě by to mělo fungovat. Sign Presenter vytvořený je. A on mi hlasí že není. :(

F.Vesely
Člen | 369
+
0
-

Musis si rucne nadefinovat role addRole(), zdroje addResource() a pravidla allow() nebo deny(). Ta chybova hlaska ti rika, ze neexistuje zdroj (Resource) Sign, ne ze neexistuje Presenter Sign. Ono totiz neni nikde psano, ze Resource musi byt vzdy Presenter, proto si je musis nadefinovat rucne.

cvit84
Člen | 43
+
0
-

F.Vesely napsal(a):

Musis si rucne nadefinovat role addRole(), zdroje addResource() a pravidla allow() nebo deny(). Ta chybova hlaska ti rika, ze neexistuje zdroj (Resource) Sign, ne ze neexistuje Presenter Sign. Ono totiz neni nikde psano, ze Resource musi byt vzdy Presenter, proto si je musis nadefinovat rucne.

$acl->addResource(‚SignPresenter‘); Prostě to mám nadefinované a mělo by mi to fungovat.

F.Vesely
Člen | 369
+
0
-

Ta hlaska zni „Resource ‚Sign‘ does not exist.“, ne „Resource ‚SignPresenter‘ does not exist.“
$acl->addResource('Sign') je spravne.

cvit84
Člen | 43
+
0
-

Neni to spravně… mi to sleze na kódu

if (!$this->user->isAllowed($this->name, $this->action)) {

Jako kdyby čekal akci sign v presenteru. Podle mě to musim někde nadefinovat, řekl bych uvnitř sign presenteru. ale nevím jak.

Šaman
Člen | 2666
+
+1
-

$this->name na presenteru vrátí jen jeho jméno. Ne filename. Stejně jako u redirectu voláš Sign:view, nikoliv SignPresenter:actionView.
Jinak doporučuji si udělat zkratku pro barDump() a pak si při jakékoliv chybě, která není jasná na první pohled, nejprve vypsat všechny vstupy a případně výstup funkce, se kterou je problém. I když v tomto případě by mělo stačit rozklinout na chybové stránce sekci argumenty a uvidíš, co vstupuje do té funkce, která vyhodila chybu.


Jinak za sebe nedoporučuji používat validaci na $presenter->name, $presenter->action. Znamená to, že musíš přidat resource nejen pro každý presenter a akci, ale i komponentu. Tvoje ACL je pak strašně dlouhé a jen těžko se v něm pozná, jaké je vlastně logické oprávnění.
Lepší je rozdělit si aplikaci právě na ta logická oprávnění (často stačí jen frontend/backend, jindy třeba podle skupin entit – kdo má právo na entitu person, ten má práva i na všechny související entity (třeba její kontakty, které se spravují na samostatné stránce)) a při kontrole oprávnění pak používáš např. person, write. I u handleDelete, i u formulářů jak na osobu, tak na její kontakty apod.

Ale samozřejmě neznám tvoji aplikaci a je i možné, že z nějakého důvodu je vhodné udělat kontrolu práv hloupou a všechno nechat na ACL. Ale většinou je to cesta do ACL pekla.