ACL a ověření zda je uživatel vlastníkem zdroje

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

Ahoj,

pročítal jsem tady hodně diskuzí a většinou jsou to hodně staré vlákna. Chci se zeptat jestli je nějaký čistý a jednoduchý způsob jak ověřit, jestli je uživatel vlastníkem zdroje a podle toho mu povolit s ním pracovat?

Předem díky za jakýkoliv nástřel.

Jan Tvrdík
Nette guru | 2595
+
0
-
hancs
Člen | 57
+
0
-

Jan Tvrdík napsal(a):

Možná pomůže přednáška od Davida Matějky

Díky moc Honzo. Zkoušel jsem napasovat ten example na mojí aplikaci, ale zasekl jsem se na téhle chybě:

Accessing methods as properties via $obj->create is deprecated

je to vyvolané tímhle v configu:

<?php
- App\Model\Autorizace\PermissionFactory
- App\Model\Autorizace\Authorizator(@App\Model\Autorizace\PermissionFactory::create)

?>

V DI zatím trochu plavu, tak bych potřeboval poradit.

David Matějka
Moderator | 6445
+
0
-

zkus

- App\Model\Autorizace\Authorizator(@App\Model\Autorizace\PermissionFactory::create())
hancs
Člen | 57
+
0
-

David Matějka napsal(a):

zkus

- App\Model\Autorizace\Authorizator(@App\Model\Autorizace\PermissionFactory::create())

Díky moc, už se mi to podařilo napasovat na můj projekt a vypadá to dost dobře. Jen jestli se ještě můžu zeptat, jak se to dá dobře používat v latte?

David Matějka
Moderator | 6445
+
0
-

@hancs mame na to specialni makro ifAllowed, takze v latte pak jen

{ifAllowed $organization, ApiKey, create}
	{control apiKeyForm}
{/ifAllowed}
hancs
Člen | 57
+
0
-

David Matějka napsal(a):

@hancs mame na to specialni makro ifAllowed, takze v latte pak jen

{ifAllowed $organization, ApiKey, create}
	{control apiKeyForm}
{/ifAllowed}

Děkuji za vytrvalost. A můžu se přes tohle makro nějak dotázat jestli daný uživatel, má právo na nějaký zdroj? Jde mi o to, že v latte vypisuji nějaké položky a chci zobrazit editační tlačítko, jen u té položky, kde je přihlášený uživatel vlastníkem.

David Matějka
Moderator | 6445
+
0
-

@hancs vyuziva to tu metodu isAllowed z presenteru, kde se to opravneni kontroluje prave proti tomu aktualne prihlasenemu uzivateli

hancs
Člen | 57
+
0
-

@DavidMatějka Moc děkuji, funguje to parádně! Jen ještě takový malý dotaz. Potřebuji aby se mi role kombinovala ještě se stavem v kterém se objekt, který chci kontrolovat nachází. Konkrétně mám například zakázku a u ní určitá práva pro uživatele, ale pokud je zakázka dokončená, chci mu práva oříznout. Pokud to chápu správně, tak si vytvořím nějaké dynamické role u zakázky, které budu přiřazovat ve funkci:

<?php
 public function getIdentityRoles(Identity $identity)
    {
        $roles = [];

       A tady porovnám jak identitu, tak můj stav a přiřadím příslušnou roli.
    }
?>

A nakonec už jen v PermissionFactory nastavím příslušná práva?

Chápu to používání správně?

Ještě jednou díky!

hancs
Člen | 57
+
0
-

Když teď přemýšlím tak bych nedělal zvláštní role, ale spíš různé akce podle stavu zakázky?

<?php
  const ACTION_EDITDOKONCENA = [self::class, 'editDokoncena'];
?>

Šlo by to?

David Matějka
Moderator | 6445
+
+1
-

@hancs oba pristupy by mely byt OK. kde jsem to potreboval, tak jsem prave mel vlastni action. ale pro komplexnejsi budou asi lepsi ruzne role

hancs
Člen | 57
+
0
-

@DavidMatějka Mohu se ještě zeptat jak je to s tím latte makrem, pokud chci kontrolovat jen nějaká globální práva? Například jestli uživatel má právo přidat nějaký příspěvek.
Chtěl jsem použít:

{ifAllowed  article, add}
		tlačítko
{/ifAllowed}

Narážím na:

Class ‚App\Model\GlobalScope‘ not found

Mockrát díky.

David Matějka
Moderator | 6445
+
+1
-

@hancs jo vidis, global scope jsem do toho prikladu zapomnel dat. je to jen dummy implementace authorization scope:

<?php declare(strict_types = 1);

namespace App\Model;

use Nette\Security\Permission;
use App\Core\Security\Identity;

class GlobalScope implements IAuthorizationScope
{

	public function getIdentityRoles(Identity $identity): array
	{
		return [];
	}

}

(pripadne vratis jen nejake globalni role z Identity)

hancs
Člen | 57
+
0
-

@DavidMatějka zdravím, měl bych ještě jeden dotaz, chtěl bych se zeptat, jakým způsobem v latte souboru používáš skládání práv, mám namysli and a or.

Něco jako {ifAllowed $detail, zakazka_polozka, ‚1-view‘ && $detail, zakazka_polozka, ‚1-edit‘}

Předem díky za odpověď

hancs
Člen | 57
+
0
-

@DavidMatějka Ahoj, prosím mohl by jsi mi nějak postrčit, jak tohle řešit?

Děkuji