Hierarchie rolí v jednoduché aplikaci
- pastyx
- Člen | 25
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
Myslím, že by mělo stačit isInRole()
nahradit za
isAllowed()
nebo jak se to jmenuje.
- pastyx
- Člen | 25
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
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.