Hierarchie rolí v jednoduché aplikaci

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

Zdravím,

mám jednoduchou aplikaci ve které jsem doposud pro autorizaci uživatelů používal pouze isLoggedIn()
a $user->isInRole('admin'). Nyní však potřebuji rozšířit aplikaci a přidat hierarchii rolí (reader/user/admin).

Napadá mě jednoduché řešení a to se jednoduše dotazovat $user->isInRole('admin')||$user->isInRole('user') ale spoustu práce by vyřešilo definovat si někde v konfiguračním souboru hierarchii a říct, že admin může vše co user a používat znovu jednoduché dotazování. V dokumentaci jsem nalezl zmínku o dědění přístupových práv a hned mě napadlo využít část toho v mé aplikaci. Nalezl jsme také, že to lze jednoduše nastavit v konfiguračním souboru a tak jsem si otevřel config.neon a napsal:

<?php
security:
    debugger: true  # panel v Debugger baru

    roles:
        reader:
        user: [reader]
        admin: [user]
?>

Bohužel když jsem přihlášen s rolí ‚admin‘ a chci projít přes $user->isInRole('reader') tak to nefunguje.

Napadá někoho jak jednoduše říci aplikaci, že ‚admin‘ může všude, kam může i ‚user‘ atd. ?

Předem děkuji za pomoc.

Editoval pastyx (17. 8. 2016 16:37)

Pavel Kravčík
Člen | 1196
+
+1
-

Myslím, že by mělo stačit isInRole() nahradit za isAllowed() nebo jak se to jmenuje.

pastyx
Člen | 25
+
0
-

Pavel Kravčík napsal(a):

Myslím, že by mělo stačit isInRole() nahradit za isAllowed() nebo jak se to jmenuje.

To ale očekává nějaký resource. Tomu se snažím vyhnout a namísto definice resourců si chci u každé metody kontrolovat jaké má uživatel práva.

ViPEr*CZ*
Člen | 818
+
0
-

A v tracy je uživatel uveden v roli admin? Je uveden v tracy i v roli reader?
Možná jde o bug? Mrknul bych se ještě jak je vygenerovaný konfigurátor v cache. Možná pomůže i cache smazat.

pastyx
Člen | 25
+
0
-

ViPErCZ napsal(a):

A v tracy je uživatel uveden v roli admin? Je uveden v tracy i v roli reader?
Možná jde o bug? Mrknul bych se ještě jak je vygenerovaný konfigurátor v cache. Možná pomůže i cache smazat.

Nejspíše není: screen

Tohle mi vygeneroval konfigurátor

<?php
/**
	 * @return Nette\Security\IAuthorizator
	 */
	public function createServiceSecurity__authorizator()
	{
		$service = new Nette\Security\Permission;
		$service->addRole('reader', NULL);
		$service->addRole('user', array('reader'));
		$service->addRole('admin', array('user'));
		return $service;
	}
?>

Možná může být problém s tím že já nikde nevyužívám žádný speciální Authorizator. Všude v prezenterech volám jednoduše $this->getUser->isInRole(), nevím co se na pozadí děje.

Editoval pastyx (17. 8. 2016 17:15)

ViPEr*CZ*
Člen | 818
+
0
-

No tohle se natáhne pro Permissions a zřejmě o tom ví pak Authorizator. Ale User o tom neví, ten si na Authorizator šahá v metodě isAllowed (v dokumentaci ostatně je, že ta konfigurace z neonu vytváří Authorizátor). Nette tím, že přidáš uživateli roli admin, tak si automaticky zbytek rolí z Autorizátoru nenatahuje.
Je to tedy jako mít dvě pole s klíči.
Jedno pole máš v DB (uživatel s klíči role).
A druhé pole je v neonu, co která role může dělat a název role je zase klíč.
Při přihlášení musíš iniciovat objekt uživatele polem třeba z DB a oproti tomu pak porovnáváš pole z neonu.
Tam co máš login, tam určitě vytváříš objekt Identity. A tam taky říkáš, že User je v roli admin. Tak tam jednoduše postni i druhou roli. Tj. druhý parametr dej pole s rolemi.
Pokud by jsi chtěl tohle použít tohle z konfigurace nadefinuj si ještě resources a k nim jednotlivé akce a používej isAllowed co jsme psali výše.