Middleware can
Middleware can применяется для авторизации действий пользователя
на основе политик доступа. Он проверяет, имеет ли текущий
аутентифицированный пользователь право на выполнение указанного
действия. Первым параметром передаётся имя разрешения (ability),
вторым - модель или идентификатор ресурса. Если пользователь
не авторизован, происходит редирект на страницу входа или
выбрасывается исключение.
Синтаксис
<?php
Route::middleware('can:ability,model')->group(function () {
// маршруты, требующие проверки прав
});
Route::can('ability', 'model')->group(function () {
// маршруты, требующие проверки прав
});
?>
Пример
Давайте ограничим доступ к редактированию статьи,
используя middleware can:
<?php
use AppModelsArticle;
Route::middleware('can:update,article')->group(function () {
Route::get('/article/{article}/edit', [ArticleController::class, 'edit']);
Route::put('/article/{article}', [ArticleController::class, 'update']);
});
?>
Пример
Рассмотрим использование middleware can
с методом can роутера:
<?php
use AppModelsArticle;
Route::can('delete', 'article')->group(function () {
Route::delete('/article/{article}', [ArticleController::class, 'destroy']);
});
?>
Пример
Давайте используем middleware can с несколькими моделями:
<?php
use AppModelsArticle;
use AppModelsComment;
Route::middleware('can:update,article,comment')->group(function () {
Route::post('/comment/{comment}/update-article/{article}',
[CommentController::class, 'updateArticle']
);
});
?>
Пример
Давайте обработаем случай, когда пользователь не имеет прав доступа:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function edit(Article $article)
{
// Этот метод будет вызван только если
// пользователь имеет право 'update' на статью
return view('articles.edit', ['article' => $article]);
}
}
?>
Пример
Давайте определим политику для проверки прав доступа:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsArticle;
class ArticlePolicy
{
public function update(User $user, Article $article)
{
return $user->id === $article->user_id;
}
public function delete(User $user, Article $article)
{
return $user->id === $article->user_id || $user->is_admin;
}
}
?>