Problém s rolemi v nette 3

jAkErCZ
Člen | 322
+
0
-

Mám problém mám role v hlavním common.neon

services:
	router: App\RouterFactory::createRouter # Nastavení služby routeru aplikace.
	authenticator: App\Model\UserManager    # Nastavení služby pro přihlašování do aplikace.
	database: @nette.database.default.context # Databáze Ryzí okna
	guru: @nette.database.guru.context # Databáze Guru
	authorizator:                  # Nastavení služby pro opravní uživatelů aplikace (ACL).
	    class: Nette\Security\Permission
	    setup:
	        - addRole(guest)
	        - addRole(member, guest)
	        - addRole(technik, guest)
	        - addRole(lead, member)
	        - addRole(admin, lead)

	        # Zdroje aplikace.
	        - addResource(Error)

	        # Pravidla přístupu.
	        - allow(admin) # Administrátor může všechno.
	        - allow(guest, Error)
includes:
	- ../CoreModule/config/config.neon # Načtení konfigurace z CoreModule.
	- ../ApiModule/config/config.neon # Načtení konfigurace z ApiModule.

A teď mám další config.neon který je v jiném modulu kde chci přidat zdroje a přivilegia

services:
	authorizator: # Nastavení zdrojů a pravidel přístupu k nim v rámci CoreModule pomocí statického ACL.
		setup:
			- addResource(%administration%)
			- allow([%member%, %technik%], %administration%, 'default')
			- allow([%member%, %technik%], %administration%, 'chart')
			- allow([%member%, %technik%], %administration%, 'logout')

			- addResource(%order%)
			- allow(%member%, %order%)

			- addResource(%acc%)
			- allow(%lead%, %acc%)

			- addResource(%bu%)
			- allow(%member%, %bu%)

			- addResource(%cli%)
			- allow([%member%, %technik%], %cli%)

			- addResource(%pro%)
			- allow(%member%, %pro%)

			- addResource(%com%)
			- allow([%member%, %technik%], %com%)

			- addResource(%fen%)
			- allow(%lead%, %fen%)

			- addResource(%cro%)
			- allow(%lead%, %cro%)

			- addResource(%set%)
			- allow(%member%, %set%, 'profil')
			- allow(%lead%, %set%)

			- addResource(%login%)
			- allow(%guest%, %login%)

Ale systém mi háže

Nette\InvalidStateException
Role 'guest' does not exist.

1223:
1224:        public function createServiceAuthenticator(): App\Model\UserManager
1225:        {
1226:            return new App\Model\UserManager($this->getService('022'), $this->getService('023'));
1227:        }
1228:
1229:
1230:        public function createServiceAuthorizator(): Nette\Security\Permission
1231:        {
1232:            $service = new Nette\Security\Permission;
1233:            $service->addRole('member', 'guest');
1234:            $service->addRole('technik', 'guest');
1235:            $service->addRole('lead', 'member');
1236:            $service->addRole('admin', 'lead');
1237:            $service->addResource('Core:Homepage');

Ale proč se tak děje když v hlavním configu mám addRole() a pokud přidám addRole() i do** config.neon** tak mi to zase začne házet

Role 'guest' already exists in the list.

Co dělám špatně?

David Grudl
Nette Core | 8218
+
0
-

Vidím nesoulad mezi obsahem kontejneru a konfigurace. Můžeš to zkusit co nejvic zjednodušit, a bylo vidět kde je problém?

jAkErCZ
Člen | 322
+
0
-

David Grudl napsal(a):

Vidím nesoulad mezi obsahem kontejneru a konfigurace. Můžeš to zkusit co nejvic zjednodušit, a bylo vidět kde je problém?

No mám common.neon

# Hlavní konfigurační soubor aplikace #
parameters:
	# Role.
	guest: guest
	member: member
	technik: technik
	lead: lead
	admin: admin

# Nastavení aplikace.
application:
	errorPresenter: Error # Presenter pro zpracování chyb a výjimek v aplikaci.
	catchExceptions: yes  # Vždy směrovat výjimky na ErrorPresenter (standartně jdou na laděnku).
	mapping:              # Konfigurace vyhledávání cesty k prezenterům.
		*: App\*Module\Presenters\*Presenter


# Nastavení expirace sessions v rámci celé aplikace.
session:
	debugger: yes
	expiration: 14 days
	cookieSamesite: Lax

# Nastavení výchozích chybových hlášek pro formuláře.
forms:
	messages:
		REQUIRED: 'Povinné pole.'
		EMAIL: 'Neplatná emailová adresa.'
# Externí knihovny
extensions:
        console: Contributte\Console\DI\ConsoleExtension(%consoleMode%)
        translation: Contributte\Translation\DI\TranslationExtension
        guzzle: Contributte\Guzzlette\DI\GuzzleExtension
        dibi: Dibi\Bridges\Nette\DibiExtension22
        smsconnect: Neogate\SmsConnect\SmsConnectExtension

guzzle:
    debug: %debugMode%
    client: # config for GuzzleHttp\Client
        timeout: 30

smsconnect:
	login:
	password:

# Nastavení jazyku aplikace
translation:
    localeResolvers:
        - Contributte\Translation\LocalesResolvers\Router
    locales:
        whitelist: [en, cs]
        default: cs
        fallback: [cs]
    dirs:
        - %appDir%/lang
# Nastavení služeb v rámci celé aplikace.
services:
	- App\RouterFactory::createRouter
	- App\Model\BaseConnection(@nette.database.default.context)
	- App\Model\GuruConnection(@nette.database.guru.context)
	- App\Forms\FormFactory
	- App\Forms\SignInFormFactory
	- App\Model\UserManager
	authorizator:                  # Nastavení služby pro opravní uživatelů aplikace (ACL).
	    class: Nette\Security\Permission
	    setup:
	        - addRole(guest)
	        - addRole(member, guest)
	        - addRole(technik, guest)
	        - addRole(lead, member)
	        - addRole(admin, lead)

	        # Zdroje aplikace.
	        - addResource(Error)

	        # Pravidla přístupu.
	        - allow(admin) # Administrátor může všechno.
	        - allow(guest, Error)

	latte.latteFactory:
		setup:
			- addFilter('czechDate', [App\Latte\Filters, 'czechDate'])
			- addFilter('czechMoth', [App\Latte\Filters, 'czechMoth'])

	- #Commmand pro odeslání dat na fénix
		class: App\Console\FenixMail
		tags: [kdyby.console.command]
	- #Commmand pro odeslání dat na fénix
		class: App\Console\CronMail1
		tags: [kdyby.console.command]
	- #Commmand pro odeslání dat na fénix
		class: App\Console\CronMail2
		tags: [kdyby.console.command]
	- #Commmand pro kontrolu platby zálohy
		class: App\Console\ControlPayment
		tags: [kdyby.console.command]
	- #Commmand pro kontrolu platby zálohy
		class: App\Console\ControlCheckMailProtection
		tags: [kdyby.console.command]
	- #Commmand pro odeslání notifikačního mailu obchodníkům
		class: App\Console\NotificationMail
		tags: [kdyby.console.command]
	- #Commmand pro odeslání notifikačního sms obchodníkům
		class: App\Console\ControlSendSmsPostoped
		tags: [kdyby.console.command]

mail:
    smtp: true # zapne SmtpMailer místo SendmailMailer
    host: debugmail.io
    port: 25
    username: webmaster@ryzidomov.cz
    password:
    secure: tls
tracy:
    # e-mail, na který se posílají notifikace, že došlo k chybě
    email: webmaster@ryzidomov.cz          # (string|string[]) výchozí je nenastaveno

# Propojení s dalšími konfiguračními soubory.
includes:
	- ../app/CoreModule/config/config.neon # Načtení konfigurace z CoreModule.
	- ../app/ApiModule/config/config.neon # Načtení konfigurace z ApiModule.

A poté v Modulu další config.neon

parameters:
        # Presentery.
        administration: Core:Homepage
        order: Core:Order
        acc: Core:Acc
        bu: Core:Bug
        cli: Core:Client
        pro: Core:Project
        com: Core:Complaint
        fen: Core:Fenix
        cro: Core:Cron
        set: Core:Settings
        login: Core:Login

# Nastavení vlastních služeb dále přístupných pomocí DI v rámci CoreModule.
services:
	authorizator: # Nastavení zdrojů a pravidel přístupu k nim v rámci CoreModule pomocí statického ACL.
		setup:
			- addRole(guest)
			- addRole(member, guest)
			- addRole(technik, guest)
			- addRole(lead, member)
			- addRole(admin, lead)

			- addResource(%administration%)
			- allow([%member%, %technik%], %administration%, 'default')
			- allow([%member%, %technik%], %administration%, 'chart')
			- allow([%member%, %technik%], %administration%, 'logout')

			- addResource(%order%)
			- allow(%member%, %order%)

			- addResource(%acc%)
			- allow(%lead%, %acc%)

			- addResource(%bu%)
			- allow(%member%, %bu%)

			- addResource(%cli%)
			- allow([%member%, %technik%], %cli%)

			- addResource(%pro%)
			- allow(%member%, %pro%)

			- addResource(%com%)
			- allow([%member%, %technik%], %com%)

			- addResource(%fen%)
			- allow(%lead%, %fen%)

			- addResource(%cro%)
			- allow(%lead%, %cro%)

			- addResource(%set%)
			- allow(%member%, %set%, 'profil')
			- allow(%lead%, %set%)

			- addResource(%login%)
			- allow(%guest%, %login%)

	# Nastavení dalších služeb v rámci CoreModule dále přístupných pomocí DI.
	- App\CoreModule\Components\IOrderListControlFactory
	- App\CoreModule\Components\IComplaintListControlFactory
	- App\CoreModule\Components\IProjectListControlFactory
	- App\CoreModule\Components\IProjectAllListControlFactory
	- App\CoreModule\Components\IProjectContractListControlFactory
	- App\CoreModule\Components\IAccListControlFactory
	- App\CoreModule\Components\IBugListControlFactory
	- App\CoreModule\Components\IClientListControlFactory

	- App\CoreModule\Model\Order\OrderRepository
	- App\CoreModule\Model\Project\ProjectRepository
	- App\CoreModule\Model\Complaint\ComplaintRepository
	- App\CoreModule\Model\Fenix\FenixRepository
	- App\CoreModule\Model\Bug\BugRepository
	- App\CoreModule\Model\Cron\CronRepository
	- App\CoreModule\Model\Settings\SettingsRepository
	- App\CoreModule\Model\Acc\AccRepository
	- App\CoreModule\Model\Client\ClientRepository
	- App\CoreModule\Model\Loader
	- App\CoreModule\Model\MailFunction
	- App\CoreModule\Model\CronFunction

A systém mi háže 500

Nette\InvalidStateException

Role 'guest' already exists in the list.

         $service->allow(['member', 'technik'], 'Core:Complaint');
1257:            $service->addResource('Core:Fenix');
1258:            $service->allow('lead', 'Core:Fenix');
1259:            $service->addResource('Core:Cron');
1260:            $service->allow('lead', 'Core:Cron');
1261:            $service->addResource('Core:Settings');
1262:            $service->allow('member', 'Core:Settings', 'profil');
1263:            $service->allow('lead', 'Core:Settings');
1264:            $service->addResource('Core:Login');
1265:            $service->allow('guest', 'Core:Login');
1266:            $service->addRole('guest');
1267:            $service->addRole('member', 'guest');
1268:            $service->addRole('technik', 'guest');
1269:            $service->addRole('lead', 'member');
1270:            $service->addRole('admin', 'lead');

Snad lepší 😊

Editoval jAkErCZ (11. 1. 2021 15:55)

David Matějka
Moderator | 6445
+
0
-

v obou tech neon souborech vidim, ze mas addRole(guest)

jAkErCZ
Člen | 322
+
0
-

David Matějka napsal(a):

v obou tech neon souborech vidim, ze mas addRole(guest)

To ano ale když to nechám jen v tom hlavním tudíž common.neon čekal bych že ostatní configy budou dědit jenže ono ne když odstraním z config.neon ty addRole()

Nastane chyba. řádek 1237

Nette\InvalidStateException

Role 'member' does not exist.

 public function createServiceAuthorizator(): Nette\Security\Permission
1234:        {
1235:            $service = new Nette\Security\Permission;
1236:            $service->addResource('Core:Homepage');
1237:            $service->allow(['member', 'technik'], 'Core:Homepage', 'default');
1238:            $service->allow(['member', 'technik'], 'Core:Homepage', 'chart');
1239:            $service->allow(['member', 'technik'], 'Core:Homepage', 'logout');
1240:            $service->addResource('Core:Order');
1241:            $service->allow('member', 'Core:Order');

Takže mi to přijde že to nedědí z toho common.neon kde to je definované a nevím proč.

Editoval jAkErCZ (11. 1. 2021 14:24)

Marek Bartoš
Nette Blogger | 1263
+
+1
-

@DavidGrudl Imho bys tomu mohl pomoci odstraněním výjimky. Že je role přidaná vícekrát sice není správně, ale imho to není ani špatně. V obou případech bude výsledkem, že je role definovaná.

@jAkErCZ Roli bys měl ideálně přidávat jen jednou a to před tím, než se začne používat. Jelikož první se používá includovaný config a ne ten hlavní (to proto, že hlavní config musí mít možnost includovaný přetížit), tak roli definuj v includovaném configu. Tzn v configu modulu nebo si přidej ještě jeden includovaný config, kde definuješ role.

jAkErCZ
Člen | 322
+
0
-

Mabar napsal(a):

@DavidGrudl Imho bys tomu mohl pomoci odstraněním výjimky. Že je role přidaná vícekrát sice není správně, ale imho to není ani špatně. V obou případech bude výsledkem, že je role definovaná.

@jAkErCZ Roli bys měl ideálně přidávat jen jednou a to před tím, než se začne používat. Jelikož první se používá includovaný config a ne ten hlavní (to proto, že hlavní config musí mít možnost includovaný přetížit), tak roli definuj v includovaném configu. Tzn v configu modulu nebo si přidej ještě jeden includovaný config, kde definuješ role.

Super 😂 Nevěděl jsem že includované configy jsou dřív. Přidáno do include configu a už to funguje 😊