Как лучше ограничивать доступ по ролям? На уровне route и/или controller?

Всем привет. Работаю с Laravel. Использую laravel-permission. (для информации)
Посоветуйте, как лучше ограничивать доступ?
Сейчас ограничиваю доступ в роутах через middleware. НО! Чаще приходится сущность делить на группу роутов, например, для простого CRUD.
Route::group(['middleware' => ['auth', 'role:author']], function () {
    ...
    Route::post('/posts/store', ['uses' => 'PostController@store', 'as' => 'posts.store']);
    Route::post('/posts/{post}/update', ['uses' => 'PostController@update', 'as' => 'posts.update']);
    // другие роуты только для author
    ...
}
Route::group(['middleware' => ['auth', 'role:editor']], function () {
    ...
    Route::post('/posts/{post}/update', ['uses' => 'PostController@update', 'as' => 'posts.update']);
    // другие роуты только для editor
    ...
}
// Можно ведь и в контроллере(DI)

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('author');
    $this->middleware('editor')->only('update');
}
// а в роуте писать
Route::resource('posts', 'PostController');

Да, я знаю, что можно для каждого отдельного
Route::get('profile', 'UserController@show')->middleware('auth');

По мне, в контроллерах гибче получается. Так вот, напишите ваши советы, как лучше, общие практики)
Спасибо!
  • Вопрос задан
  • 1529 просмотров
Решения вопроса 1
nepster-web
@nepster-web
Тут все зависит от ваших задач и архитектуры.

laravel-permission предоставляет вам различные инструменты для гибкого управления прав доступа: в документации есть примеры для блейда, для модели, для контроллера и для милдлверов.

В этом вопросе вам нужно полагаться на свою архитектуру и на задачу. Например есть ситуации, когда не целесообразно в милдлвере проверять доступ, так как для сложной логике необходимо получить данные для проверки (а может ли пользователь редактировать именно эту запись именно в это время именно с этого IP).

Так-же очень большой нюанс зависит от вашей архитектуры, например я использую DDD и проверка прав доступа происходит в UseCase в application слое, при чем проверка не одна, а несколько (может ли пользователь вообще редактировать записи, а потом может ли редактировать конкретную).

Ответом на вопрос будет что-то вроде такого:
Средствами laravel-permission можно ограничить доступ по ролям в контроллере, однако нужно учитывать Ваш архитектурный подход, SOLID принципы и тп.

От себя еще добавлю, скорее всего у вас RAD разработка, поэтому особо можно не заморачиваться и проверять где удобнее.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы