Laravel Gates, Policies

0

Hej,

napisałem aplikację w tym frameworku ( Laravel 5.x) i na koniec zostawiłem dorobienie autoryzacji.
W tym momencie skorzystałem z tego co daje framework: logowanie, zakładanie usera, dodałem role, przypisuję role do usera czyli taki CRUD user + role.
Zainteresowałem się politykami i mam pytanie:
przykładowy Policy

public function canUserAccessDocument(User $user, Document $document)
    {
        if($user->customer_id === $document->customer_id)
        {
            return true;
        }
        elseif ($user->hasAnyRole([User::ROLE_ADMINISTRATOR, User::ROLE_SALESMANAGER])) {
            return true;
        }

        return false;
    }

zarejestrowałem ją tak

    protected $policies = [
        Document::class => DocumentPolicy::class,
    ];

i np. w kontrolerze gdy chcę otworzyć dokument

$this->authorize('canUserAccessDocument', $document);

pytanie czy i jak mogę tego użyć w widoku aby np. pokazać ukrywać linki, przyciski. Jest @can ale moja polityka oczekuje $document. Jak to zrobić.

Dodatkowo dlaczego definiując Gate

    public function boot()
    {
        $this->registerPolicies();

        Gate::define('add-document', function ($user) {
            return false;
        });
    }

i we widoku używając np.

@can('add-document')
     Dodaj Pozycję
@endcan

nie ukrywa "dodaj pozycje"?

moje Laravelowe policy w głowie są nie poukładane. co robię źle? Generalnie chciałbym napisać kilka polityk ( odnoszących się do encji i po to one są ) ale też zapewne kilka Gate w których tylko coś chce sprawdzić i np. ukryć przycisk. Zapewne potrzebuję misz masz polityk i gejtów/

1

Z tego co widzę to zdefiniowałeś poprawnie bramę, ale zauważ, że w samym widoku nie przekazujesz zalogowanego użytkownika do bramy.

Powinieneś zrobić coś w rodzaju:

@can('add-document', Auth::user())
     Dodaj Pozycję
@endcan

Ten sam sposób możesz wykorzystać do przekazania dokumentu do policy.

W dokumentacji widzę konkretne przykłady, które mogą ci pomóc w implementacji :)
https://laravel.com/docs/5.7/authorization#policy-filters

0

Jeszcze jedno pytanie dotyczące wydajności.
Powiedzm, że mamy Gate, który sprawdza coś takiego

if($user->hasRole(jakisRole))
Return true;

I we widoku gdzie wyswietlam dane z bazy w petli
Wrzucam @can() link do edycji @endcan

I teraz chodzi o wydajnosc takiego tworu. Sprawdzenie nastepuje dla kazdego wiersza = sporo zapytan = lista generuje sie dluzej.
Jak to robicie? Czy moze lepiej zostawic link do edycji a po jego kliknieciu 403?

1

Widoczny link do edycji jest na pewno złym pomysłem, użytkownik powinien widzieć być świadomy co może, a czego nie może.
Możesz filtrować listę opierając się na roli?
Jeżeli martwisz się o wydajność to zawsze możesz sprawdzić długość renderowania listy z @can oraz bez :)

0

Co do renderowania listy z lub bez juz bez mierzenia jest gorzej.
Mam np dwie role: jedna z nich widzi swoje dokumenty, druga swoje i tego 1szego i jeszcze innych ale edycje tylko swojego.
Dlatego @can w pętli daje możliwość pokaż/ukryj button edycji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1