Dynamické ACL – Přechod ze statických oprávnění

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

Mám zatím statické AuthorizatorFactory a chtěl bych jej předělat na dynamické (DB).

Co jsem koukal může mít uživatel více rolí tedy do:

Nette\Security\Identity // V Authenticator (IAuthenticator)
  1. Mohu uložit Array se všemi rolemi ? (zatím jsem měl jen jednu)
  2. Používáte někde pro uživatele více rolí ? (Co modul to role), přijde mi lepší aby měl uživatel jen jednu roli
  3. Nebo co modul to jiný resource (zatím jsem to tak ve stat. AuthorizatorFactory měl) ?

Koukal jsem na tutorial: Dynamická správa rolí a zdrojů

Pochopil jsem to tedy následovně:

  • vytvořím si 2 modely Acl a AclModel (zde načtu všechny role a k nim přidružené zdroje + oprávnění)
  • zaregistruji v config.neon ? (v manuálu je uveden config.ini) – ta mě vytvoří instanci se všemi rolemi
  • při přihlášení si načtu pro uživatele jeho role a pak jen pomocí isAllowed atd:. se budu dotazovat na oprávnění jakožto celek

Další a poslední věc:
Jak řešíte dodatečná oprávnění ? Máme role, zdroj a oprávnění a potřebuji přidat ještě další 2(3) parametry

  1. Mohu rozšířit Nette\Security\User tím že ji podědím
  2. Nebo si napíšu do Entity User ještě spešl IsAtRegion()

Chci si to napsat nejdříve přes nette db a potom přes doctrine2

Díky všem za inspiraci

CZechBoY
Člen | 3608
+
0
-

Dynamický bude asi stejný jak statický jen s rozdílem, že to nevypíšeš do zdrojáku, ale načteš z db.

Jaký parametry máš na mysli? Nedá se to třeba serializovat a překrýt isAllowed metodu v Permission?

Joacim
Člen | 229
+
0
-

CZechBoY napsal(a):

Dynamický bude asi stejný jak statický jen s rozdílem, že to nevypíšeš do zdrojáku, ale načteš z db.

Jaký parametry máš na mysli? Nedá se to třeba serializovat a překrýt isAllowed metodu v Permission?

U dalších parametrů ještě neznám přesnou specifikaci, možná to půjde realizovat jednodušeji (např jen DB dotazem).

Tzn. AuthorizatorFactory jen přepíšu (AclModel) a pak si v AuthorizatorFactory přidám jen konstruktor (z Acl nebo create jak to mám ted)? (V té nejjednodušší formě ?)

tedy config.neon zustane nezměněn

authorizatorFactory: App\Model\AuthorizatorFactory
        authorizator: @authorizatorFactory::create

a aut

class AuthorizatorFactory {

    /**
     * @return \Nette\Security\IAuthorizator
     */
    public function create() {
        $permission = new Permission();

        // public boolean isAllowed( string $role, string $resource, string $privilege )

        /* seznam uživatelských rolí */
        $permission->addRole('guest'); // Default user for cleared session exception
        $permission->addRole('user');
        $permission->addRole('superuser');
        $permission->addRole('admin');

        /* seznam zdrojů */
        $permission->addResource('Homepage');
        $permission->addResource('Reservations');
        $permission->addResource('Setup');
        $permission->addResource('Gallery');

        /* seznam pravidel oprávnění */
        $permission->allow('guest', array('Homepage'), 'view');
        $permission->allow('user', array('Homepage', 'Reservations'), array('view', 'edit', 'agendaFilter'));

        /* Super user & Admin */
        $permission->allow('superuser', 'Homepage', Permission::ALL);
        $permission->allow('superuser', 'Reservations', Permission::ALL);
        $permission->allow('superuser', 'Setup', array('view', 'edit', 'addUser', 'editUser', 'deleteUser','editDevices','deleteDevices','addDevices'));
        $permission->allow('superuser', 'Gallery', array('view', 'addImage', 'editImage', 'deleteImage'));

        /* ADMIN má práva na všechno */
        $permission->allow('admin', Permission::ALL, Permission::ALL);

        return $permission;
    }

}
CZechBoY
Člen | 3608
+
0
-

Tak nic. Koukam, ze User::isAllowed neposila vsechny parametry co prijdou jako u autentizace, ale jen ty 2.

Muzes teda udelat ledatak serializaci parametru a poslat je do autorizatoru pres privilege.
Potom prizpusobit metodu v autorizatoru.

Joacim
Člen | 229
+
0
-

CZechBoY napsal(a):

Tak nic. Koukam, ze User::isAllowed neposila vsechny parametry co prijdou jako u autentizace, ale jen ty 2.

Muzes teda udelat ledatak serializaci parametru a poslat je do autorizatoru pres privilege.
Potom prizpusobit metodu v autorizatoru.

Taky jsem to zkoušel, no to nevadí.

Stejně nejdřím musím udělat dynamické ACL.
Používáš pro uživatele více rolí nebo to máš ošetřeno jinak (např. pokud se používají moduly)

CZechBoY
Člen | 3608
+
0
-

Obcas jsou kombinovany role takze ma uzivatel treba 3 role. Ale ze bych jim daval role podle modulu to ne.
Ja si vzdycky udelam nazev zdroje podle toho kam pristupuju vcetne namespace. Treba presenter, komponenta, … Takze takhle nejak to mam jakoby rozdeleny na moduly.

Joacim
Člen | 229
+
0
-

CZechBoY napsal(a):

Obcas jsou kombinovany role takze ma uzivatel treba 3 role. Ale ze bych jim daval role podle modulu to ne.
Ja si vzdycky udelam nazev zdroje podle toho kam pristupuju vcetne namespace. Treba presenter, komponenta, … Takze takhle nejak to mam jakoby rozdeleny na moduly.

Takhle jsem to taky plánoval rozdělit, jen furt přemítám jaká varianta je lepší či nikoliv, abych nemusel furt předělávat DB strukturu
Pokud muže mít uživatel více rolí musím mít vazbu MN od uživatele na ACL, Pokud má jen jednu nemusím mít MN vazbu (napojení pouze uživatel na ACL což jsem měl i ve stat.AuthorizatorFactory rozděleno podle presenterů )