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 */
}