ACL (Access Control List) – nefungují oprávnění

gizer
Člen | 67
+
0
-

Ahojky,

má trochu problém s ACL. Nadefinoval jsem uživatel, zdroje a oprávnění. Bez problému se přihlásím jako admin, member nebo guest popř. se úplně odhlásím. Podle nastavení v common.neon bych neměl mít přístup na stránku administration:default jako odhlášený nebo jako guest. Pouze jako admin nebo member. Přesto mně to tam bez problému pustí. Jako by ty oprávnění nefungovala? Kde mohu dělat chybu?
Děkuji moc za případnou radu.

Nastavení v common.neon

# Nastavení společných uživatelských rolí v rámci celé aplikace (ACL).
security:
	roles:
		guest:
		member:  [guest]
		admin:

services:
	authenticator: App\Model\UserManager    # Nastavení služby pro přihlašování do aplikace.
	security.authorizator:                  # Nastavení služby pro opravní uživatelů aplikace (ACL).
	    setup:
	        # Zdroje aplikace.
	        	- addResource(Error)
	        	- addResource(Homepage)
	        	- addResource(Sign)
	        	- addResource(Administration)

	        # Pravidla přístupu.
	        	- allow(admin) # Administrátor může všechno.
	        	- allow(guest, Error) # Error stránka "guest"
	        	- allow(guest, Homepage, default)	# Přístup na homepage "guest"
	        	- allow(guest, Sign, in) # Přihlášení pro "guest"
	        	- allow(guest, Sign, up) # Registrace pro "guest"
	        	- deny(guest, Administration, default) 		# Zákaz vstupu do admin části
	        	- allow(member, Administration, default)	# Vstup povolen pouze pro přihlášeného

Editoval gizer (1. 4. 2020 10:51)

Ages
Člen | 128
+
+1
-

Máš implementovanou tu kontrolu oprávnění např. pomocí checkRequirements?

public function checkRequirements($element): void
{
	//...
}
gizer
Člen | 67
+
0
-

Takže jestli jsem to pochopil, tak nastavení v common.neon mně samo o sobě nezakáže přístup například do prezenteru „Adminstration“ a šablony „default“. Musím někde vykonat autorizační dotaz pro toto povolení (nebo zákaz) a jeho výstup (toho dotazu) mně pak přesměruje třeba zpátky na přihlášení ?

Ages
Člen | 128
+
0
-

Je to tak jak píšeš, nastavíš tam pravidla pro určitý resource, ale pak to musíš ještě kontrolovat. Nejjednodušší je to v nějakém předkovi tvých presenterů.
Nedávno jsem zde konzultoval tuto metodu viz: https://forum.nette.org/…requirements
Místo těch dumpů si nastavíš $resource dle dané akce a potom to musíš ještě zkontrolovat
Něco jako:

if ($resource !== null && !$this->user->isAllowed($resource)) {
	if ($this->user->isLoggedIn()) {
		// ...
	} else {
		// ...
	}
}

Editoval Ages (1. 4. 2020 19:21)

gizer
Člen | 67
+
0
-

Vyzkoušel jsem jednoduše toto a zdá se, že to funguje. Pokud nemám oprávnění nastaveno v pravidlech přístupu v common.neon, tak jsem zde přesměrován na homepage. Tento kód je zapsán v předkovi presenterů.

if (!$this->getUser()->isAllowed($this->getName(), $this->getAction())) {
            $this->flashMessage('Nemáš oprávnění');
            $this->redirect(':Homepage:default');
        }

Každopádně moc děkuji za pomoc a za navedení.

Editoval gizer (1. 4. 2020 21:21)

Ages
Člen | 128
+
0
-

V tomto případě budeš muset nastavit oprávnění pro každou akci presenteru, což mi přijde hodně psaní a pak případě náročné změny.
Nestačilo by ti to kontrolovat pouze nad presenterem a logiku případně rozdělit do více presenterů?