Szukaj…


Wprowadzenie

Laravel zapewnia prosty sposób autoryzacji działań użytkownika na określonych zasobach. Dzięki Autoryzacji możesz selektywnie zezwalać użytkownikom na dostęp do niektórych zasobów, jednocześnie odmawiając dostępu do innych. Laravel zapewnia prosty interfejs API do zarządzania uprawnieniami użytkowników za pomocą Gates oraz Policies . Gates zapewniają proste, oparte na zamknięciu podejście do autoryzacji za pomocą AuthServiceProvider podczas gdy Policies pozwalają organizować logikę autoryzacji wokół modeli za pomocą klas.

Korzystanie z bramek

Gates są zamknięciami, które określają, czy użytkownik może wykonać określone działanie na zasobie. Gates są zazwyczaj definiowane w metodzie rozruchowej AuthServiceProvider i zwięźle nazywane, aby odzwierciedlić to, co robi. Przykład bramy, która pozwala tylko użytkownikom premium oglądać niektóre treści, będzie wyglądał następująco:

Gate::define('view-content', function ($user, $content){
    return $user->isSubscribedTo($content->id);
});

Gate zawsze otrzymuje instancję użytkownika jako pierwszy argument, nie trzeba jej przekazywać podczas korzystania z bramy i może opcjonalnie otrzymywać dodatkowe argumenty, takie jak wymowny model.

Autoryzowanie akcji za pomocą bramek

Aby skorzystać z powyższego przykładu na szablonie bloku do ukrycia treści przed użytkownikiem, zwykle zrobiłbyś coś takiego:

@can('view-content', $content)
 <! -- content here -->
@endcan

Aby całkowicie zapobiec nawigacji do zawartości, możesz wykonać następujące czynności w kontrolerze:

if(Gate::allows('view-content', $content)){
    /* user can view the content */
}

        OR

if(Gate::denies('view-content', $content)){
    /* user cannot view content */
}

Uwaga: Nie musisz przekazywać obecnie uwierzytelnionego użytkownika do tej metody, Laravel dba o to za Ciebie.

Zasady

Zasady to klasy, które pomagają zorganizować logikę autoryzacji wokół zasobu modelu. Korzystając z poprzedniego przykładu, możemy mieć ContentPolicy która zarządza dostępem użytkowników do modelu Content .

Aby uczynić ContentPolicy , laravel udostępnia polecenie rzemieślnika. Po prostu biegnij

php artisan make:policy ContentPolicy

Spowoduje to utworzenie pustej klasy zasad i umieszczenie ich w folderze app/Policies . Jeśli folder nie istnieje, Laravel go utworzy i umieści klasę w środku.

Po utworzeniu zasady muszą zostać zarejestrowane, aby pomóc Laravelowi wiedzieć, których zasad należy użyć podczas autoryzacji działań na modelach. AuthServiceProvider Laravela, który jest dostarczany ze wszystkimi świeżymi instalacjami Laravel, ma właściwość policy, która mapuje twoje wymowne modele na ich polityki autoryzacji. Wszystko, co musisz zrobić, to dodać mapowanie do tablicy.

protected $policies = [
    Content::class => ContentPolicy::class,
 ];

Pisanie zasad

Pisanie Policies zgodne z tym samym schematem, co pisanie Gates . Bramkę uprawnień do treści można przepisać jako Politykę taką jak ta:

function view($user, $content)
{
    return $user->isSubscribedTo($content->id);
}

Zasady mogą zawierać w razie potrzeby więcej metod, aby zająć się wszystkimi przypadkami autoryzacji dla modelu.

Autoryzowanie działań za pomocą zasad

Poprzez model użytkownika

Model użytkownika Laravel zawiera dwie metody, które pomagają w autoryzacji za pomocą Policies ; can i can't . Tych dwóch można użyć do ustalenia, czy użytkownik ma odpowiednio uprawnienia do modelu.

Aby sprawdzić, czy użytkownik może wyświetlić zawartość, czy nie, możesz wykonać następujące czynności:

if($user->can('view', $content)){
    /* user can view content */
}

        OR

if($user->cant('view', $content)){
    /* user cannot view content */
}

Poprzez oprogramowanie pośrednie

Route::get('/contents/{id}, function(Content $content){
    /* user can view content */
})->middleware('can:view,content');

Poprzez kontrolery

Laravel udostępnia metodę pomocniczą, zwaną authorize która przyjmuje jako argument nazwę strategii i powiązanego modelu i albo autoryzuje akcję w oparciu o logikę autoryzacji, albo odrzuca akcję i zgłasza wyjątek AuthorizationException który program obsługi wyjątków Laravel przekształca w 403 HTTP response

pubic function show($id)
{
    $content = Content::find($id);

    $this->authorize('view', $content);
        
    /* user can view content */
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow