Problém s rolemi v nette 3
- jAkErCZ
- Člen | 322
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
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
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)
- jAkErCZ
- Člen | 322
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
@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
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 😊