Я создаю спокойный api в laravel 4, где есть пользователи с разными типами разрешений. Я хочу ограничить доступ к различным маршрутам в зависимости от роли пользователя (которая сохраняется в таблице пользователя в db)
Как мне это сделать? Вот что я до сих пор (пока он не работает).
filters.php
//allows backend api access depending on the user's role once they are logged in Route::filter('role', function() { return Auth::user()->role; });
routes.php
Route::group(array('before' => 'role'), function($role) { if($role==1){ Route::get('customer/retrieve/{id}', 'CustomerController@retrieve_single'); Route::post('customer/create', 'CustomerController@create'); Route::put('customer/update/{id}', 'CustomerController@update'); } });
Возможно ли, что я пишу синтаксис неправильно для «группового фильтра»?
Попробуйте следующее:
filters.php
Route::filter('role', function() { if ( Auth::user()->role !==1) { // do something return Redirect::to('/'); } });
routes.php
Route::group(array('before' => 'role'), function() { Route::get('customer/retrieve/{id}', 'CustomerController@retrieve_single'); Route::post('customer/create', 'CustomerController@create'); Route::put('customer/update/{id}', 'CustomerController@update'); });
Существуют различные способы реализации этого, для запуска фильтров Route принимают аргументы:
Route::filter('role', function($route, $request, $value) { // }); Route::get('someurl', array('before' => 'role:admin', function() { // }));
Вышеприведенное будет вводить администратор в ваш фильтр Route ::, доступный через параметр $ value. Если вам нужна более сложная фильтрация, вы всегда можете использовать собственный класс фильтра маршрутов (проверьте классы фильтров): http://laravel.com/docs/routing#route-filters
Вы также можете фильтровать в своем контроллере, что обеспечивает лучший подход, когда вам необходимо фильтровать на основе определенных контроллеров и методов: http://laravel.com/docs/controllers#controller-filters
Наконец, вы можете использовать что-то вроде Sentry2, которое предоставляет полное решение RBAC для использования в вашем проекте: https://cartalyst.com/manual/sentry
Из laravel 5.1.11 вы можете использовать AuthServiceProvider: https://laravel.com/docs/5.1/authorization