Laravel и Sentinel: промежуточное ПО смешивания ролей для авторизации

Я новичок в Laravel (ОЧЕНЬ новичок), использую Cartalyst Sentinel на Laravel 5.2 для авторизации ролей.

В разделе администратора у меня есть три (или более) роли, то есть «администратор», «агент» и «писатель».

У меня также есть некоторые разделы, которые должны иметь доступ к смешанным ролям, то есть вот так:

  • панель управления (доступна для всех ролей: администратор, агент, писатель)
  • пользователи (доступны для: admin)
  • заказы (доступны: админ, агент)
  • страницы (доступны: администратору, писателю)
  • no_admin_here (доступен: агенту, писателю)

На данный момент мне удалось поработать только с двумя ролями, но сейчас я застрял.

Что я сделал до сих пор (поставил только необходимый код):

routes.php

// only authenticated users can access these pages
Route::group(['prefix' => 'admin', 'as' => 'admin.', 'middleware' => ['check']], function(){

    // these pages are accessible to all roles
    Route::get('dashboard', ['as' => 'dashboard', function(){
        return view('admin/dashboard');
    }]);

    // only admin can access this section
    Route::group(['middleware' => 'admin'], function(){

        Route::get('users', function(){
            return view('admin/users');
        });

    });

});

ПО промежуточного слоя SentinelCheck (в Kernel.php называется "проверка")

if (!Sentinel::check()) { // user is not authenticated
    return redirect()->route('admin.login')->with('error', 'You must be logged to view the page');
}
if (Sentinel::inRole('customer')) { // user is authenticated but he is a customer
    return redirect()->route('admin.login')->with('error', 'You are a customer and cannot access to backend section');
}

Промежуточное ПО SentinelAdmin (в Kernel.php называется admin)

if (!Sentinel::inRole('admin')) { // user is authenticated but he is not an admin
    return redirect()->route('admin.login')->with('error', 'You are not admin and cannot view requested section');
}

Промежуточное ПО SentinelAgent (в Kernel.php называется агентом)

if (!Sentinel::inRole('agent')) { // user is authenticated but he is not an agent
    return redirect()->route('admin.login')->with('error', 'You are not agent and cannot view requested section');
}

Пока все хорошо, как я уже сказал, но когда я пытаюсь смешивать роли, все идет не так; т.е. я не могу написать такой маршрут:

// only admin and agent can access this section
Route::group(['middleware' => ['admin', 'agent']], function(){

    Route::get('orders', function(){
        return view('admin/orders');
    });

});

потому что «агент» никогда не достигнет раздела, так как промежуточное ПО «admin» заблокирует его и выйдет из системы. И точно так же я не могу смешивать все остальные роли:

['middleware' => ['admin', 'writer']]
['middleware' => ['agent', 'writer']]
['middleware' => ['admin', 'writer', 'whatever_else_role']]

и т.д..

Итак, есть ли (простой) способ, которым я могу легко смешивать доступ ролей к разделам? Заранее спасибо за помощь


person Ivan    schedule 20.03.2016    source источник


Ответы (1)


Было проще, чем я ожидал, использовать параметры промежуточного программного обеспечения

person Ivan    schedule 23.03.2016